在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,我在网上搜索了很多,但没有找到答案。有没有可能这样做?
答案 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
对阵列中每个嵌套级别所产生的成本。