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?

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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.