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)
ina*_*gaJ 13
首先,findOne()和find()之间的基本区别:
findOne - 如果查询匹配,则返回第一个文档,否则返回null.
find - nomatter匹配的文档数,返回游标,永不为null.
因此,当放入if条件时,findOne可以在与任何文档不匹配时转换为false.当find返回一个游标对象并且永远不会返回null时,在置于if条件时将转换为true.
find和findOne返回以下空集合:
即使查询条件与任何文档都不匹配,该方法也始终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)
您发现自己陷入的陷阱是在 javascript 中从 mongo shell 对象到布尔值的相当无证的转换:
findOne()返回一个document,或者 nil/null/whatever-it-is-Called
find()返回一个cursor,它可以是空的。但是返回的对象始终是定义的。
| 归档时间: |
|
| 查看次数: |
15556 次 |
| 最近记录: |