如何使用mongodb聚合返回字符串数组

6 mongodb mongodb-query aggregation-framework

我需要返回mongodb聚合的字符串数组.我做了以下事情:

db.users.aggregate([{$group: {_id:"$emails.address"}}])
Run Code Online (Sandbox Code Playgroud)

它返回:

{ "_id" : [ "a@a.com" ] }
{ "_id" : [ "b@a.com" ] }
{ "_id" : [ "c@a.com" ] }
Run Code Online (Sandbox Code Playgroud)

有没有办法像这样返回字符串数组:

["a@a.com","b@a.com","c@a.com"]
Run Code Online (Sandbox Code Playgroud)

非常感谢任何花时间帮助我的人

编辑

添加数据:

{
    "_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
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

Bla*_*ven 15

无论你做什么,该.aggregate()方法总是返回Objects,并且不能改变.

为了您的目的,您可能最好使用.distinct(),而只返回不同值的数组:

db.users.distinct("emails.address");
Run Code Online (Sandbox Code Playgroud)

这正是您想要的输出:

["a@a.com","b@a.com","c@a.com"]
Run Code Online (Sandbox Code Playgroud)

如果你真的想要使用.aggregate()那么转换到只需要在后处理中表达式"外部"的值.$unwind在处理像这样的数组时你也应该使用它.

您可以使用JavaScript执行此操作,.map()例如:

db.users.aggregate([
    { "$unwind": "$emails" },
    { "$group": { "_id": "$emails.address" } }
]).map(function(el) { return el._id })
Run Code Online (Sandbox Code Playgroud)

它提供相同的输出,但是.map()转换客户端而不是服务器端.

  • 有没有办法在服务器端进行,因为客户端映射会降低性能 (3认同)

Dus*_*gal 5

什么布雷克七已经回答是正确的。

无论您做什么,并且不能更改,.aggregate()方法始终返回Object。

但是,这并不意味着您不能将它们放入数组中并在对象中返回该数组。

我相信数据库本身在数组中的映射会更好,因为您的节点服务器仍可用于其他请求。

db.users.aggregate([
     { "$unwind": "$emails" },
     { "$group": { "_id": null, emails:{$push:"$emails.address"} } },
     { "$project":{emails:true,_id:false}}
 ])
Run Code Online (Sandbox Code Playgroud)

这将返回:

{ "emails" : [ "a@a.com", "b@a.com", "c@a.com" ] }
Run Code Online (Sandbox Code Playgroud)