Comment interroger des objects enfants dans mongodb

Je suis nouveau sur mongodb et j’essaie d’interroger des objects enfants. J’ai une collection d’États et chaque État a des villes d’enfants. Une des villes a une propriété Name qui est nulle, ce qui provoque des erreurs dans mon application. Comment puis-je interroger les collections d’état pour trouver des villes enfants qui ont un nom == null?

S’il est exactement null (par opposition à non défini):

 db.states.find({"cities.name": null}) 

(mais comme le fait remarquer javierfp, cela correspond aussi aux documents qui ne contiennent aucun tableau de villes, je suppose qu’ils le font).

Si c’est le cas, la propriété n’est pas définie:

 db.states.find({"cities.name": {"$exists": false}}) 

J’ai testé ce qui précède avec une collection créée avec ces deux inserts:

 db.states.insert({"cities": [{name: "New York"}, {name: null}]}) db.states.insert({"cities": [{name: "Austin"}, {color: "blue"}]}) 

La première requête trouve le premier état, la seconde requête le deuxième. Si vous voulez les trouver tous les deux avec une seule requête, vous pouvez créer un $or requête:

 db.states.find({"$or": [ {"cities.name": null}, {"cities.name": {"$exists": false}} ]}) 

En supposant que votre collection “états” est comme:

 {"name" : "Spain", "cities" : [ { "name" : "Madrid" }, { "name" : null } ] } {"name" : "France" } 

La requête pour trouver des états avec des villes nulles serait:

 db.states.find({"cities.name" : {"$eq" : null, "$exists" : true}}); 

C’est une erreur fréquente d’interroger des valeurs nulles comme suit:

 db.states.find({"cities.name" : null}); 

car cette requête renverra tous les documents manquant de la clé (dans notre exemple, elle renverra l’Espagne et la France). Donc, sauf si vous êtes sûr que la clé est toujours présente, vous devez vérifier que la clé existe comme dans la première requête.