MongoDB中的find()和findOne()方法显示不同的结果

Anu*_*iku 9 mongodb mongodb-query

我有一个Mongo数据库,在users集合中我只有1个文档.我使用用户名过滤器执行find()和findOne()操作.我认为我认为是find()操作的错误结果.

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" : "test@yahoo.co.in", "password" : "rootuser", "mobile" : NumberLong(1234567890) }
> db.users.findOne()
{
    "_id" : ObjectId("5807ac0765f24dd0660e4332"),
    "username" : "avtrulzz",
    "fname" : "Abc",
    "lname" : "Def",
    "email" : "test@yahoo.co.in",
    "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
Run Code Online (Sandbox Code Playgroud)

查看find操作返回用户是否存在,这是不正确的.findOne()表现正常.在此输入图像描述

ina*_*gaJ 13

首先,findOne()和find()之间的基本区别:

  • findOne - 如果查询匹配,则返回第一个文档,否则返回null.

  • find - nomatter匹配的文档数,返回游标,永不为null.

因此,当放入if条件时,findOne可以在与任何文档不匹配时转换为false.当find返回一个游标对象并且永远不会返回null时,在置于if条件时将转换为true.

find和findOne返回以下空集合:

在此输入图像描述


sty*_*ane 6

即使查询条件与任何文档都不匹配,该方法也始终find()返回一个。cursortruthy

另一方面,如果没有任何文档与指定条件匹配,findOne则返回与您的查询条件匹配的第一个文档(JavaScript 或语言驱动程序中的等效项)。null

> 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
Run Code Online (Sandbox Code Playgroud)


mtj*_*mtj 5

您发现自己陷入的陷阱是在 javascript 中从 mongo shell 对象到布尔值的相当无证的转换:

findOne()返回一个document,或者 nil/null/whatever-it-is-Called

find()返回一个cursor,它可以是空的。但是返回的对象始终是定义的。