返回结果mongoose查找变量查询

时间:2014-06-04 11:10:51

标签: node.js mongodb mongoose 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;
    };
});

为了拥有:

results = docs 

非常感谢您的回复。

我还有另一个问题。

如何使用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);
    };
});

4 个答案:

答案 0 :(得分:64)

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

<强> 1。使用Mongoose查询

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

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

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

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。使用像Mongoose Promise一样的对象

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

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

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

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

正如本回答的评论部分所强调的那样,这些对象实际上并不是承诺,需要加以考虑(参见Queries are not promises)。

第3。使用Mongoose Streams

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

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

然后你就可以做到:

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,供将来参考。

答案 1 :(得分:5)

it is being executed before the assignment.

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

});

答案 2 :(得分:1)

您可以轻松实现这一目标。

    const getUser = async ( req, res ) => {
        let users = () => ( User.find({_id : users_list[i]['user_id']},{email : 1, credits : 1}).exec() );
        try {  res.send({"user":await users() });}
        catch(e) { console.log(e) }
    }    
    app.get('/user' , getUser);

答案 3 :(得分:0)

您可以通过以下代码获得所需的结果。希望对您有帮助。.

QMainWindow window;
window.setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
window.setAttribute(Qt::WA_TranslucentBackground, true);
window.setFixedSize(800, 600);

QWidget widget(&window);
widget.setStyleSheet("background-color: rgba(255, 0, 0, 128)");

window.setCentralWidget(&widget);
window.show();