wie man untergeordnete Objekte in mongodb abfragt

79

Ich bin neu in Mongodb und versuche, untergeordnete Objekte abzufragen. Ich habe eine Sammlung von Staaten, und jeder Staat hat Kinderstädte. Eine der Städte hat eine Name-Eigenschaft, die null ist, was zu Fehlern in meiner App führt. Wie würde ich die Statussammlungen abfragen, um untergeordnete Städte mit einem Namen == null zu finden?

Justin
quelle

Antworten:

113

Wenn es genau ist null(im Gegensatz zu nicht gesetzt):

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

(aber wie javierfp betont, stimmt es auch mit Dokumenten überein, die überhaupt kein Städte-Array haben, ich gehe davon aus, dass dies der Fall ist).

Wenn die Eigenschaft nicht festgelegt ist:

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

Ich habe das Obige mit einer Sammlung getestet, die mit diesen beiden Beilagen erstellt wurde:

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

Die erste Abfrage findet den ersten Status, die zweite Abfrage den zweiten. Wenn Sie beide mit einer Abfrage finden möchten, können Sie eine $orAbfrage durchführen:

db.states.find({"$or": [
  {"cities.name": null}, 
  {"cities.name": {"$exists": false}}
]})
Das Ö
quelle
wie ich alle untergeordneten Objekte bekommen kann. Mit Projektion
bekomme
38

Angenommen, Ihre "Staaten" -Sammlung lautet wie folgt:

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

Die Abfrage zum Finden von Staaten mit Nullstädten wäre:

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

Es ist ein häufiger Fehler , nach Nullen zu fragen:

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

da diese Abfrage alle Dokumente zurückgibt, denen der Schlüssel fehlt (in unserem Beispiel werden Spanien und Frankreich zurückgegeben). Wenn Sie nicht sicher sind, dass der Schlüssel immer vorhanden ist, müssen Sie überprüfen, ob der Schlüssel wie in der ersten Abfrage vorhanden ist.

Javier Ferrero
quelle