jak sprawdzać obiekty potomne w mongodb


80

Jestem nowy w mongodb i próbuję przeszukiwać obiekty potomne. Mam zbiór stanów, a każdy stan ma miasta potomne. Jedno z miast ma właściwość Name, która ma wartość null, co powoduje błędy w mojej aplikacji. Jak przeszukiwać zbiory stanowe, aby znaleźć miasta podrzędne o nazwie == null?

Odpowiedzi:


114

Jeśli jest dokładnie null(w przeciwieństwie do nieustawionego):

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

(ale jak wskazuje javierfp, pasuje również do dokumentów, które nie mają w ogóle tablicy miast, zakładam, że tak).

Jeśli jest tak, że właściwość nie jest ustawiona:

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

Przetestowałem powyższe z kolekcją utworzoną za pomocą tych dwóch wkładek:

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

Pierwsze zapytanie znajduje pierwszy stan, drugie zapytanie znajduje drugi. Jeśli chcesz znaleźć je oba za pomocą jednego zapytania, możesz wykonać $orzapytanie:

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

jak mogę uzyskać wszystkie obiekty podrzędne. używając projekcji, otrzymuję tylko jedną nieruchomość
Yashraj basan

38

Zakładając, że Twoja kolekcja „stanów” wygląda następująco:

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

Zapytanie do znalezienia stanów z pustymi miastami wyglądałoby tak:

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

Częstym błędem jest tworzenie zapytań o wartości null jako:

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

ponieważ to zapytanie zwróci wszystkie dokumenty bez klucza (w naszym przykładzie zwróci Hiszpanię i Francję). Tak więc, jeśli nie jesteś pewien, że klucz jest zawsze obecny, musisz sprawdzić, czy klucz istnieje tak, jak w pierwszym zapytaniu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.