在MongoDB中计数和更新嵌套数组
问题描述:
我是使用mongo数据库的新手,并且一直试图找出一种方法来获取mongo db集合中的嵌套数组的计数,如下所示。在MongoDB中计数和更新嵌套数组
{
city_id: 'C1',
city_name: "C1Name",
wards: [{
ward_id: "W1",
ward_number: "1",
areas: [{
area_id: "a1",
area_name: "a1Name"
},
{
area_id: "a2",
area_name: "a2Name"
}]
},
{
ward_id: "W2",
ward_number: "2",
areas: [{
area_id: "a21",
area_name: "a21Name"
}, {
area_id: "a22",
area_name: "a22Name"
}]
}]
},
{
city_id: 'C2',
city_name: "C2Name",
wards: [{
ward_id: "W21",
ward_number: "21",
areas: [{
area_id: "aw21",
area_name: "aw21Name"
},{
area_id: "aw22",
area_name: "aw22Name"
}]
},{
ward_id: "W132",
ward_number: "132",
areas: [{
area_id: "a132",
area_name: "a132Name"
}, {
area_id: "a1332",
area_name: "a2112Name"
}]
}]
}
现在在这里我要在city_id = C1和ward_id = W1
我用聚集的
db.city_details.aggregate(
{$match:{"city_id":"C1"}},
{$project:{"wards":"$wards"}},
{$unwind:"$wards"},
{$project{"ward":"$wards.id","area":"$wards.areas"}},
{$match:{ward:"W1"}},
{$project:{$count:{"area"}}
)
city_details区域的数目这应该让我数为2,但它不是”不工作。
另外如何更新这些区域数组?
答
您的查询不起作用的原因是因为{$match:{ward:"W1"}}
在先前的结果中找不到W1
。
运行{$match:{ward:"W1"}}
之前的结果是这样的:
{
"area" : [
{
"area_id" : "a1",
"area_name" : "a1Name"
},
{
"area_id" : "a2",
"area_name" : "a2Name"
}
]
},
{
"area" : [
{
"area_id" : "a21",
"area_name" : "a21Name"
},
{
"area_id" : "a22",
"area_name" : "a22Name"
}
]
}
没有W1
找到。
相反,你可以使用这样的查询:
db.city_details.aggregat([
{$match: {"city_id": "C1"}},
{$project: {"ward": {$filter: {"input": "$wards", "as": "ward", "cond": { $eq: ["$$ward.ward_id", "W1"]}}}}},
{$unwind:"$ward"},
{$project: {"size": {$size: "$ward.areas"}}}
])
关于你的第二个问题。这并不容易,this post会给你更多关于更新mongodb中更新嵌套数组的信息。
嗨,感谢Julian您的查询完成了这项工作,但我不明白在$ eq操作符 – TGW
中使用了两个$符号更多详细信息可以在[mongodb docu](https://docs.mongodb。 COM /手动/参考/聚集变量/)。但总之,_ $$ _可以从_ward_获得当前值。 –