find() and findOne() methods in MongoDB showing different results
mongodb, mongodb-query
Solution
First of all, basic difference between `findOne()` and `find()`:
`findOne()` - if query matches, first document is returned, otherwise null.
`find()` - no matter the number of documents matched, a cursor is returned, never null.
So when put in an if condition, `findOne()` can convert to false when it doesn't match any document. As `find()` returns a cursor object and never returns null, will convert to true when put in an if condition.
`find` and `findOne()` return the following for empty collection :
Problem
I have a Mongo database where in the users collection I have just 1 document. I do a `find()` and a `findOne()` operations using the username filter. I get what I think is an incorrect result from `find()` operation. ``` 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 ``` See the `find()` operation is returning user exists which is not true. `findOne()` is behaving correctly.