返回结果mongoose查找变量查询

Xan*_*rus 23 mongoose mongodb node.js mongodb-query

我需要在node.js中使用mongoose返回查询结果.

如何返回值以将值设置为变量?

我需要做的是:

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;
    };
});
Run Code Online (Sandbox Code Playgroud)

为了有:

results = docs 
Run Code Online (Sandbox Code Playgroud)

非常感谢您的回复 .

我还有另一个问题.

如何使用find或findOne在查询运算符中传递变量?喜欢 :

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);
    };
});
Run Code Online (Sandbox Code Playgroud)

Edw*_*rzo 66

有几种方法可以达到你想要的效果.

1.使用Mongoose查询

在此策略中,您的函数返回一个Mongoose查询,您稍后可以使用该查询来调用该方法exec并使用它来获取结果.

function getJedisQuery(name){
   var query = Jedi.find({name:name});
   return query;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以简单地使用它:

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

2.使用类似Mongoose Promise的对象

Moogose为类似承诺的对象提供支持.您所要做的就是与我上面所做的有些相似,但这一次,您在exec没有回调的情况下调用该方法.

function getJedisPromise(name){
   var promise = Jedi.find({name:name}).exec();
   return promise;
}
Run Code Online (Sandbox Code Playgroud)

然后您只需执行以下操作即可使用它:

var promise = getJedisPromise('Luke');
promise.then(function(jedis){
   jedis.forEach(function(jedi){
      console.log(jedi.name);
   });
})
Run Code Online (Sandbox Code Playgroud)

正如本答案的评论部分所强调的那样,这些对象实际上并不是承诺,需要将其考虑在内(请参阅查询不是承诺).

3.使用Mongoose Streams

最后,Mongoose还支持流和流是事件发射器.因此,您可以获得一个流,然后订阅"数据"和"错误"事件.像这样:

function getjedisStream(name){
   var stream = Jedi.find({name:name}).stream();
   return stream;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以简单地做:

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);
});
Run Code Online (Sandbox Code Playgroud)

来源,供将来参考.

  • 我知道OP对答案很满意,但你实际上并没有解释如何将结果放在可以在其余代码中使用的`results`变量中. (6认同)
  • 一个小编辑你的答案.mongoose promises中没有.error功能.当我使用它时会出现以下错误 - TypeError:promise.then(...).错误不是函数nodejs如果我们想要错误处理那么我们应该做类似mongoose.Promise = require('q')的事情. ; 然后使用函数.catch(function(err){ (4认同)

小智 5

它正在分配之前执行.

 async function(req, res) {
      var user;
      await users.findOne({}, function(err,pro){
          user=pro;
        });
      console.log(user); \\ it's define
    };
Run Code Online (Sandbox Code Playgroud)