find() und findOne () - Methoden in MongoDB, zeigt unterschiedliche Ergebnisse
Ich habe eine Mongo-Datenbank, wo in der users-Auflistung habe ich nur 1 Dokument.
Ich mache find()
und ein findOne()
Operationen mit dem Benutzernamen filtern.
Ich bekomme, was ich denke, ist ein Falsches Ergebnis aus find()
Betrieb.
MongoDB shell version: 3.2.10
connecting to: test
Server has startup warnings:
2016-10-20T20:37:32.681-0700 I CONTROL [initandlisten]
2016-10-20T20:37:32.681-0700 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2016-10-20T20:37:32.681-0700 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2016-10-20T20:37:32.681-0700 I CONTROL [initandlisten]
2016-10-20T20:37:32.681-0700 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2016-10-20T20:37:32.681-0700 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2016-10-20T20:37:32.681-0700 I CONTROL [initandlisten]
> use lab2
switched to db lab2
> db.users.find()
{ "_id" : ObjectId("5807ac0765f24dd0660e4332"), "username" : "avtrulzz", "fname" : "Abc", "lname" : "Def", "email" : "[email protected]", "password" : "rootuser", "mobile" : NumberLong(1234567890) }
> db.users.findOne()
{
"_id" : ObjectId("5807ac0765f24dd0660e4332"),
"username" : "avtrulzz",
"fname" : "Abc",
"lname" : "Def",
"email" : "[email protected]",
"password" : "rootuser",
"mobile" : NumberLong(1234567890)
}
> if (db.users.find({username : "noSuchUsername"})) {
... print ("Username exists");
... } else {
... print ("User does not exist"); }
Username exists
> if (db.users.findOne({username : "noSuchUsername"})) { print ("Username exists"); } else { print ("User does not exist"); }
User does not exist
> if (db.users.findOne({username : "avtrulzz"})) { print ("Username exists"); } else { print ("User does not exist"); }
Username exists
Sehen die find()
Betrieb wieder Benutzer gibt, das ist nicht wahr. findOne()
sich richtig verhält.
- Sie sagen, das problem ist das mit den unterschieden in Ausgaben in den ersten beiden Abfragen ( die find() vs. die findOne() ), oder die Ergebnisse der letzten Befehle (if-blocks ) ? Was die Ausgabe macht Sie denken, dass die Ergebnisse falsch sind?
- Ich denke, dass find() sollte auch return "Benutzer ist nicht vorhanden", da es keinen user namens "noSuchUsername" existiert nicht
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst grundlegende Unterschied zwischen
findOne()
undfind()
:findOne()
- if-Abfrage Streichhölzer, erste-Dokument zurückgegeben, andernfalls null.find()
- nomatter Anzahl der Dokumente, die abgestimmt haben, wird ein cursor zurückgegeben, niemals null.So, wenn Sie in einer if-Bedingung,
findOne()
umwandeln kann, false, wenn es nicht mit jedem Dokument. Wie finden Sie gibt ein cursor-Objekt und nie null zurück, konvertiert zu true, wenn Sie in einer if-Bedingung.find
undfindOne()
Folgendes zurück für leere Sammlung :Die Falle, die Sie sich in den eher undokumentierten Konvertierung von mongo-shell-Objekte für Boolesche Werte in javascript:
findOne() gibt eine Dokument, oder null/null/was auch immer-es-ist-genannt
finden() gibt eine cursor, die auch leer sein kann. Aber die Objekt zurückgegeben wird, ist immer definiert.
Den die
find()
Methode gibt eine diecursor
das ist immertruthy
selbst wenn die Abfrage der Kriterien entspricht nicht jedes Dokument.Auf der anderen Seite, die
findOne
gibt die erste Dokument, das entspricht die Abfrage-Kriterien odernull
(JavaScript oder den Gegenwert in Ihre Sprache Treiber) wenn es nicht alle Dokumente, die den angegebenen Kriterien entspricht.Vielleicht zu finden, ist keine richtige Kandidat für boolean check, auch wenn es keine Daten gibt Sie einen leeren cursor, das geht so in boolean
oder
findOne korrekt arbeitet, weil, wenn keine Daten gefunden werden, wird null zurückgegeben und die Pässe als false boolean check.