在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
“每个”数组:
.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
所产生的成本更高的费用。
https://stackoverflow.com/questions/50525825
复制相似问题