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?

AlbertEngelB
źródło

Odpowiedzi:

193

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

db.collection.find({ "fieldToCheck": { $exists: true, $ne: null } })
Sergio Tulentsev
źródło
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}})
Pavan Choudhary
źródło
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}})
Yakir Manor
źródło
0
db.<COLLECTION NAME>.find({ "<FIELD NAME>": { $exists: true, $ne: null } })
Hardik Gajjar
źródło