Sprawdź, czy pole istnieje w MongoDB


136

Więc próbuję znaleźć wszystkie rekordy, które mają ustawione pole i nie są puste.

Próbuję używać $exists, jednak zgodnie z dokumentacją MongoDB to zapytanie zwróci pola o wartości null.

$exists pasuje do dokumentów zawierających pole przechowujące wartość null.

Więc teraz zakładam, że będę musiał zrobić coś takiego:

db.collection.find({ "fieldToCheck" : { $exists : true, $not : null } })

Za każdym razem, gdy próbuję tego, pojawia się błąd. [invalid use of $not] Czy ktoś ma pomysł, jak zapytać o to?

Odpowiedzi:


193

Użyj $ne(dla „nierówne”)

db.collection.find({ "fieldToCheck": { $exists: true, $ne: null } })

Co to wraca? Pusta kolekcja? Pojedynczy przedmiot? Tablica?
Oliver Dixon

5
@iLoveUnicorns: to, co findzawsze zwraca: zbiór rekordów spełniających kryteria.
Sergio Tulentsev

3
@SergioTulentsev AFAIK zwraca kursor
fernandohur

@fernandohur: tak, ale jeśli masz mniej niż jedną stronę dokumentów, nawet nie zauważysz różnicy. A jeśli miałbyś uruchomić to zapytanie z zewnętrznego sterownika, jestem prawie pewien, że większość z nich chroni Cię przed szczegółami implementacji kursora.
Sergio Tulentsev

25

Załóżmy, że mamy kolekcję taką jak poniżej:

{ 
  "_id":"1234"
  "open":"Yes"
  "things":{
             "paper":1234
             "bottle":"Available"
             "bottle_count":40
            } 
}

Chcemy wiedzieć, czy pole na butelki jest obecne, czy nie?

Odp:

db.products.find({"things.bottle":{"$exists":true}})

3
When <boolean> is true, $exists matches the documents that contain the field, including documents where the field value is null. Z dokumentów.
AlbertEngelB

1
tak, ale nie rozumiem, dlaczego DB miałby zawierać wartość null, jest niechlujny
Martijn Scheffer

3

uważam, że to działa dla mnie

db.getCollection('collectionName').findOne({"fieldName" : {$ne: null}})

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.