2016-10-21 145 views
3

我有一個Mongo數據庫,在用戶集合中我只有1個文檔。 我使用用戶名過濾器執行find()和findOne()操作。 我得到我認爲find()操作的結果不正確。MongoDB中的find()和findOne()方法顯示不同的結果

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 

見find操作將返回用戶存在這是不正確的。 findOne()表現正確。 enter image description here

+0

你說的問題是前兩個查詢(find()與findOne())或最後一個命令(if塊)的結果有差異嗎?輸出結果如何讓你認爲結果不正確? –

+0

我認爲find()還應該返回「User does not exist」,因爲沒有用戶名稱爲「noSuchUsername」不存在 –

回答

5

的所有第一,findOne之間的基本區別()和find():

  • findOne - 如果查詢匹配,第一個文檔返回,否則返回null。

  • 查找 - 無匹匹配的文檔數量,返回遊標,從不爲空。

因此,當放入if條件時,findOne可以在與任何文檔不匹配時轉換爲false。由於find返回一個遊標對象,並且永遠不會返回null,所以在放入if條件時將轉換爲true。

查找和findOne返回下面的空收集:

enter image description here

3

你發現自己的缺陷是從蒙戈外殼對象在JavaScript布爾值相當無證轉換:

findOne()返回文件,或零/零/不管-IT-是-called

查找()返回光標,它可以是空的。但總是定義返回的對象

3

即使查詢條件與任何文檔都不匹配,find()方法也會返回cursor,總是truthy

在另一方面,findOne返回符合您查詢條件或null(JavaScript或在你的語言驅動程序的等價物),如果沒有符合指定條件的文檔頭文件

> db.dropDatabase() 
{ "dropped" : "test", "ok" : 1 } 
> var cursor = db.collection.find(); 
> cursor; 
> typeof cursor; 
object 
> !cursor; 
false 
> var document = db.collection.findOne(); 
> document; 
null 
> typeof document; 
object 
> !document; 
true 
1

也許發現不是布爾檢查正確的候選人,即使沒有數據則返回一個空指針,其通過在布爾爲真

if (db.users.find({username : "noSuchUsername"}).toArray().length>0) { 
... print ("Username exists"); 
... } else { 
... print ("User does not exist"); } 

if (db.users.find({username : "noSuchUsername"}).size()>0) { 
    ... print ("Username exists"); 
    ... } else { 
    ... print ("User does not exist"); } 

findOne工作正常,因爲如果沒有找到數據,它會返回null,在布爾檢查中返回false。

相關問題