【问题标题】:unwind and group for the nested array objects in mongodbmongodb中嵌套数组对象的展开和分组
【发布时间】:2018-11-04 15:41:55
【问题描述】:

在 mongodb 中,我有这样的数据结构:

{
    "data" : [ 
        {
            "car" : [ 
                {
                    "model" : "aaa",
                }, 
                {
                    "model" : "bbb",
                }, 
                {
                    "model" : "ccc",
                }
            ],
            "user" : {
                "id" : "123"
            }
        }
    ],
}

我想对汽车模型字段进行分组和计数。所以首先我尝试了这样的 unwind 方法:

.aggregate([
  { $project: {"data.car.model":1, "data.user.id":1} },
  { $unwind: {
      path: "$data.car",
      preserveNullAndEmptyArrays: true
      } },
  { $group: {
      _id: "$data.car.model",
      count: { $sum: 1 }
      } }
])

但结果是:

{
    "_id" : [ ["aaa", "bbb", "ccc"] ],
    "count" : 1.0
}

这不是我想要的,因为模型没有展开。我希望的结果是:

[{_id:"aaa",count:1}, {_id:"bbb",count:1}, {_id:"ccc", count:1}]

然后通过查看 mongodb unwind array nested inside an array of documents,我尝试了$project嵌套数组:

.aggregate([
  { $project: {"car":"$data.car.model", "user":"$data.user.id"} },
])

但结果是:

{
    "car" : [ ["aaa", "bbb", "ccc"] ],
    "user" : ["123"]
}

如您所见,汽车和用户被嵌入到一个数组中,我仍然无法应用 $unwind 方法。但是,我希望它应该是这样的:

{
    "car" : ["aaa", "bbb", "ccc"],
    "user" : "123"
}

我使用的mongo是3.2,我在网上搜索了很多但没有找到答案。有可能吗?

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    你需要$unwind"each" 独立排列:

    .aggregate([
      { "$unwind": { "path": "$data", "preserveNullAndEmptyArrays": true } },
      { "$unwind": { "path": "$data.car", "preserveNullAndEmptyArrays": true } },
      { "$group": {
        "_id": "$data.car.model",
        "count": { "$sum": 1 }
      }}
    ])
    

    您实际上无法像您尝试的那样“接触”和$unwind。所以你首先“解开”外部数组,然后是“内部”数组。然后将文档展平以进行分组。

    另一种方法可能是在“展开”之前使用$reduce“展平数组”:

    .aggregate([
      { "$project": {
        "data": {
          "$reduce": {
            "input": "$data.car",
            "initialValue": [],
            "in": {
              "$concatArrays": [ "$$value", "$$this" ]
            }
          }
        }
      }},
      { "$unwind": "$data" },
      { "$group": {
        "_id": "$data.model",
        "count": { "$sum": 1 }
      }}
    ])
    

    但实际上并不推荐这样做,因为“投影”更可能涉及比使用$unwind 对数组中的每一级嵌套所产生的成本更高的成本。

    【讨论】:

    • 更好更干净的解决方案。 +1 (y)
    猜你喜欢
    • 2021-07-20
    • 1970-01-01
    • 2017-03-03
    • 2015-02-25
    • 2012-07-23
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多