在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中更新嵌套数组的信息。

+0

嗨,感谢Julian您的查询完成了这项工作,但我不明白在$ eq操作符 – TGW

+0

中使用了两个$符号更多详细信息可以在[mongodb docu](https://docs.mongodb。 COM /手动/参考/聚集变量/)。但总之,_ $$ _可以从_ward_获得当前值。 –