.aggregate() metod returnerar alltid Objects oavsett vad du gör och det kan inte ändras.
För ditt ändamål är det förmodligen bättre att använda .distinct() istället, vilket bara returnerar en array av de distinkta värdena:
db.users.distinct("emails.address");
Vilket är exakt din önskade utdata:
["example@sqldat.com","example@sqldat.com","example@sqldat.com"]
Om du verkligen vill använda .aggregate() då behöver omvandlingen till bara värdena ske "utanför" uttrycket i efterbehandling. Och du bör också använda $unwind när man hanterar sådana här arrayer.
Du kan göra detta med JavaScript .map() till exempel:
db.users.aggregate([
{ "$unwind": "$emails" },
{ "$group": { "_id": "$emails.address" } }
]).map(function(el) { return el._id })
Vilket ger samma utdata, men .map() gör transformationsklientsidan istället för på servern.