在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"] }
正如您所看到的,car和用户被嵌入到一个数组中,我仍然不能应用$unwind方法。不过,我希望是这样:
{ "car" : ["aaa", "bbb", "ccc"], "user" : "123" }
我使用的mongo是3.2,我在网上搜索了很多,但没有找到答案。是否有可能这样做?
发布于 2018-05-25 09:28:11
您需要独立地 $unwind “每个” 数组:
$unwind
.aggregate([ { "$unwind": { "path": "$data", "preserveNullAndEmptyArrays": true } }, { "$unwind": { "path": "$data.car", "preserveNullAndEmptyArrays": true } }, { "$group": { "_id": "$data.car.model", "count": { "$sum": 1 } ])
当你尝试的时候,你实际上不能“进入”和 $unwind 。因此,您首先“取消包装”外部数组,然后是“内部”数组。然后对文档进行整理以进行分组。
另一种方法可能是在“展开”之前使用 $reduce “夷平数组”:
$reduce
.aggregate([ { "$project": { "data": { "$reduce": { "input": "$data.car", "initialValue": [], "in": { "$concatArrays": [ "$$value", "$$this" ]