Überprüfen Sie, ob das Feld mit MongoDB vorhanden ist

131

Ich versuche also, alle Datensätze zu finden, für die ein Feld festgelegt wurde und die nicht null sind.

Ich versuche zu verwenden $exists, aber gemäß der MongoDB-Dokumentation gibt diese Abfrage Felder zurück, die gleich null sind.

$exists stimmt mit Dokumenten überein, die das Feld enthalten, in dem der Nullwert gespeichert ist.

Ich gehe jetzt davon aus, dass ich so etwas tun muss:

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

Immer wenn ich dies versuche, erhalte ich die Fehlermeldung. [invalid use of $not] Hat jemand eine Idee, wie man dies abfragt?

AlbertEngelB
quelle

Antworten:

183

Verwenden Sie $ne(für "ungleich")

db.collection.find({ "fieldToCheck": { $exists: true, $ne: null } })
Sergio Tulentsev
quelle
Was bringt das zurück? Eine Nullsammlung? Ein einziger Artikel? Eine Anordnung?
Oliver Dixon
4
@iLoveUnicorns: Was findimmer zurückkommt: eine Sammlung von Datensätzen, die den Kriterien entsprechen.
Sergio Tulentsev
2
@SergioTulentsev AFAIK es gibt einen Cursor zurück
fernandohur
@fernandohur: Ja, aber wenn Sie weniger als eine Seite Dokumente haben, werden Sie nicht einmal den Unterschied sehen. Und wenn Sie diese Abfrage über einen externen Treiber ausführen, sind Sie sich ziemlich sicher, dass die meisten von ihnen Sie vor den Details der Cursor-Implementierung schützen.
Sergio Tulentsev
23

Angenommen, wir haben eine Sammlung wie die folgende:

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

Wir wollen wissen, ob das Flaschenfeld vorhanden ist oder nicht?

Ans:

db.products.find({"things.bottle":{"$exists":true}})
Pavan Choudhary
quelle
2
When <boolean> is true, $exists matches the documents that contain the field, including documents where the field value is null. Aus den Dokumenten.
AlbertEngelB
1
Ja, aber ich verstehe nicht, warum eine DB den Wert null enthalten würde, es ist schlampig
Martijn Scheffer
3

Ich finde, dass das bei mir funktioniert

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