我需要返回带有MongoDB聚合的字符串数组。我做了以下工作:

db.users.aggregate([{$group: {_id:"$emails.address"}}])

它返回:
{ "_id" : [ "a@a.com" ] }
{ "_id" : [ "b@a.com" ] }
{ "_id" : [ "c@a.com" ] }

有没有方法返回这样的字符串数组:
["a@a.com","b@a.com","c@a.com"]

非常感谢任何花时间帮助我的人。
编辑
添加数据:
{
    "_id" : "ukn9MLo3hRYEpCCty",
    "createdAt" : ISODate("2015-10-24T03:52:11.960Z"),
    "emails" : [
        {
            "address" : "a@a.com",
            "verified" : false
        }
    ]
}
{
    "_id" : "5SXRXraariyhRQACe",
    "createdAt" : ISODate("2015-10-24T03:52:12.093Z"),
    "emails" : [
        {
            "address" : "b@a.com",
            "verified" : false
        }
    ]
}
{
    "_id" : "WMHWxeymY4ATWLXjz",
    "createdAt" : ISODate("2015-10-24T03:52:12.237Z"),
    "emails" : [
        {
            "address" : "c@a.com",
            "verified" : false
        }
    ]
}

最佳答案

无论您做什么,并且不能更改,.aggregate()方法始终返回。
出于您的目的,您最好使用Objects代替,它只返回一个不同值的数组:

db.users.distinct("emails.address");

这正是您想要的输出:
["a@a.com","b@a.com","c@a.com"]

如果您真的想使用.distinct(),那么在后期处理中,只需要在表达式的“外部”发生值的转换。在处理这样的数组时,还应该使用.aggregate()
您可以使用javascript进行此操作,例如:
db.users.aggregate([
    { "$unwind": "$emails" },
    { "$group": { "_id": "$emails.address" } }
]).map(function(el) { return el._id })

这提供了相同的输出,但转换客户端(而不是服务器端)执行的是$unwind

10-06 05:26
查看更多