2017-08-16 1 views
0

Je suis novice dans l'utilisation de mongo db et j'ai essayé de trouver un moyen d'obtenir le compte d'un tableau imbriqué dans la collection mongo db qui ressemble à ceci.Nombre et mise à jour d'un tableau imbriqué dans 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" 
    }] 
    }] 
} 

maintenant ici je veux nombre de domaines dans city_details où CITY_ID = C1 et ward_id = W1

J'utilise l'agrégation comme

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"}} 
    ) 

Cela devrait me faire compter comme 2 mais il n » est pas t travaillant.

Comment puis-je mettre à jour ces zones de tableaux?

Répondre

0

La raison pour laquelle votre requête ne fonctionne pas est parce que {$match:{ward:"W1"}} ne peut pas trouver W1 dans le résultat précédent.

Le résultat avant d'exécuter {$match:{ward:"W1"}} ressemble à ceci:

{ 
    "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" 
     } 
    ] 
} 

Il n'y a pas W1 à trouver.

vous pouvez plutôt utiliser une requête comme ceci:

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"}}} 
]) 

En ce qui concerne votre deuxième question. Ce n'est pas si simple, this post vous donnera plus à lire sur la mise à jour des tableaux imbriqués dans mongodb.

+0

Hii, merci Julian votre requête a fait le travail mais je ne comprends pas l'utilisation de deux signes $ dans l'opérateur $ eq – TGW

+0

Plus de détails peuvent être trouvés dans le document [mongodb docu] (https: //docs.mongodb. com/manual/reference/agrégation-variables /). Mais en somme, avec _ $$ _ vous pouvez accéder à la valeur actuelle de _ward_. –