【问题标题】:How to return array of string with mongodb aggregation如何使用 mongodb 聚合返回字符串数组
【发布时间】:2016-01-30 06:19:49
【问题描述】:

我需要返回带有 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
        }
    ]
}

【问题讨论】:

  • 你能发布你的数据吗
  • 嗨@ScottStensland 我已经添加了数据,,,谢谢......
  • 您好,您的意思是在名称中返回数组值对还是仅在数组中返回?
  • 嗨@HaRLoFei 只返回数组。有什么想法吗??

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

.aggregate() 方法始终返回 Objects,无论您做什么,这都无法改变。

出于您的目的,您最好使用.distinct(),它只返回一个不同值的数组:

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

这正是您想要的输出:

["a@a.com","b@a.com","c@a.com"]

如果您真的想使用.aggregate(),那么在后处理中,需要在表达式“外部”转换为值。在处理这样的数组时,您还应该使用$unwind

您可以使用 JavaScript .map() 来做到这一点,例如:

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

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

【讨论】:

  • 有没有办法在服务器端实现,因为客户端映射会降低性能
  • @ChiDov 我在这里回答了在 mongodb 上做的事情:stackoverflow.com/a/46599310/4308032 它会给你一个数组,但它仍然会嵌入到对象中。
【解决方案2】:

Blakes Seven has answered 是对的。

无论你做什么,.aggregate() 方法总是返回对象 这不能改变。

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

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

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

这将返回:

{ "emails" : [ "a@a.com", "b@a.com", "c@a.com" ] }

【讨论】:

    猜你喜欢
    • 2015-02-14
    • 1970-01-01
    • 2022-08-13
    • 2020-11-27
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多