Le .aggregate() la méthode renvoie toujours Objects quoi que vous fassiez et cela ne peut pas changer.
Pour votre objectif, vous feriez probablement mieux d'utiliser .distinct() à la place, qui renvoie simplement un tableau des valeurs distinctes :
db.users.distinct("emails.address");
Quelle est exactement la sortie souhaitée :
["example@sqldat.com","example@sqldat.com","example@sqldat.com"]
Si vous voulez vraiment utiliser .aggregate() alors la transformation en valeurs uniquement doit se produire "en dehors" de l'expression en post-traitement. Et vous devriez également utiliser $unwind lorsqu'il s'agit de tableaux comme celui-ci.
Vous pouvez le faire avec JavaScript .map() par exemple :
db.users.aggregate([
{ "$unwind": "$emails" },
{ "$group": { "_id": "$emails.address" } }
]).map(function(el) { return el._id })
Ce qui donne la même sortie, mais le .map() effectue la transformation côté client plutôt que sur le serveur.