Xanarus Xanarus - 4 months ago 46
Node.js Question

Return results mongoose in find query to a variable

I need to return the results of a query with mongoose in node.js.

How do you return the value to set the value to a variable?

What I need to do is:

var results = users.findOne({_id : users_list[i]['user_id']},{email : 1, credits : 1},{}, function(err, docs) {
if( err || !docs) {
console.log("No user found");
} else {
return docs;
};
});


In order to have:

results = docs


Thanks a lot for your reply .

I also have another problem.

How to pass variable in a query operator with find or findOne? Like :

var foo = "Blaa";

users.findOne({_id : users_list[i]['user_id']},{email : 1, credits : 1},{}, function(err, docs) {
if( err || !docs) {
console.log("No user found");
} else {
// I want to use the foo variable here
console.log(foo);
};
});

Answer

There are several ways to achieve what you want.

1. Using Mongoose Queries

In this strategy, your function returns a Mongoose query which you can later use to invoke the method exec and use it to get the results.

function getJedisQuery(name){
   var query = Jedi.find({name:name});
   return query;
}

Then you can use it simply doing:

var query =  getJedisQuery('Obi-wan');
query.exec(function(err,jedis){
   if(err)
      return console.log(err);
   jedis.forEach(function(jedi){
      console.log(jedi.name);
   });
});

2. Using Mongoose Promises

Moogose provides support for promises. All you have to do is something somewhat similar to what I did above, but this time, you invoke the exec method without a callback.

function getJedisPromise(name){
   var promise = Jedi.find({name:name}).exec();
   return promise;
}

Then you can use it by simply doing:

var promise = getJedisPromise('Luke');
promise.then(function(jedis){
   jedis.forEach(function(jedi){
      console.log(jedi.name);
   });
}).error(function(error){
   console.log(error);
});

3. Using Mongoose Streams

Finally, Mongoose has also support for streams and streams are event emitters. So, you could get a stream and then subscribe for 'data' and 'error' events. Like this:

function getjedisStream(name){
   var stream = Jedi.find({name:name}).stream();
   return stream;
}

Then you can simply do:

var stream = getJedisStream('Anakin');
stream.on('data', function(jedis){
   jedis.forEach(function(jedi){
      console.log(jedi.name);
   });
});
stream.on('error', function(error){
    console.log(error);
});

Source, for future reference.