How to use mongoose findOne

node.jsMongodbCoffeescriptMongoose

node.js Problem Overview


I have the below schema (apologies that it is in coffeescript)

Schema = mongoose.Schema

AuthS = new Schema
	auth:	{type: String, unique: true}
	nick:	String
	time:	Date
Auth = mongoose.model 'Auth', AuthS

I simply want to recover one record which is definitely in my database:

Auth.findOne({nick: 'noname'}, function(obj) { console.log(obj); });

Unfortunately this always logs null. db.auths.findOne({nick: 'noname'}) in mongo shell always returns a value. What is going on?

node.js Solutions


Solution 1 - node.js

Found the problem, need to use function(err,obj) instead:

Auth.findOne({nick: 'noname'}, function(err,obj) { console.log(obj); });

Solution 2 - node.js

Mongoose basically wraps mongodb's api to give you a pseudo relational db api so queries are not going to be exactly like mongodb queries. Mongoose findOne query returns a query object, not a document. You can either use a callback as the solution suggests or as of v4+ findOne returns a thenable so you can use .then or await/async to retrieve the document.

// thenables
Auth.findOne({nick: 'noname'}).then(err, result) {console.log(result)};
Auth.findOne({nick: 'noname'}).then(function (doc) {console.log(doc)});

// To use a full fledge promise you will need to use .exec()
var auth = Auth.findOne({nick: 'noname'}).exec();
auth.then(function (doc) {console.log(doc)});

// async/await
async function async auth() {
  const doc = await Auth.findOne({nick: 'noname'}).exec();
  return doc;
}
auth();

See the docs if you would like to use a third party promise library.

Solution 3 - node.js

In my case same error is there , I am using Asyanc / Await functions , for this needs to add AWAIT for findOne

Ex:const foundUser = User.findOne ({ "email" : req.body.email });

above , foundUser always contains Object value in both cases either user found or not because it's returning values before finishing findOne .

const foundUser = await User.findOne ({ "email" : req.body.email });

above , foundUser returns null if user is not there in collection with provided condition . If user found returns user document.

Solution 4 - node.js

You might want to consider using console.log with the built-in "arguments" object:

console.log(arguments); // would have shown you [0] null, [1] yourResult

This will always output all of your arguments, no matter how many arguments you have.

Solution 5 - node.js

Use obj[0].nick and you will get desired result,

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionCallum RogersView Question on Stackoverflow
Solution 1 - node.jsCallum RogersView Answer on Stackoverflow
Solution 2 - node.jsIsaac PakView Answer on Stackoverflow
Solution 3 - node.jsBhagvat LandeView Answer on Stackoverflow
Solution 4 - node.jsNeil Gaetano LindbergView Answer on Stackoverflow
Solution 5 - node.jsNaturalCoderView Answer on Stackoverflow