How to use mongoose findOne

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?

1

5 Answers

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

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

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.

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.

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.

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

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like