2017-08-16 97 views
0

我是使用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,但它不是」不工作。

另外如何更新這些區域數組?

回答

0

您的查詢不起作用的原因是因爲{$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_獲得當前值。 –