在mongodb

时间:2018-05-25 09:25:59

标签: mongodb mongodb-query

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

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

我想分组并统计汽车模型领域。所以首先我尝试了这样的展开方法:

.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,我在网上搜索了很多,但没有找到答案。有没有可能这样做?

1 个答案:

答案 0 :(得分:5)

您需要独立$unwind "每个" 数组:

.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对阵列中每个嵌套级别所产生的成本。