如何将mongodb查询结果存储在变量中?

时间:2016-02-04 03:46:33

标签: node.js mongodb

我最难找到一个应该如此简单的解决方案。我想在mongo数据库中找到一个文档并将其存储在一个我可以在node.js app中的任何地方使用的变量中。

我认为最接近的是

var path = db.collection('paths').find().toArray()

其中path是一个包含一个文档的集合,但是console.log(path[0])返回undefined ..

2 个答案:

答案 0 :(得分:2)

尝试异步方式,类似这样

var path;
db.collection('paths', function(err, collection) {
    collection.find({}).toArray(function(err, results) {
        path = results;
        console.log(results);
    });
});

注意
永远不要尝试在node.js中同步运行IO操作,因为node.js是单线程的。如果这样做,您将阻止整个应用程序。由mongodb nodejs native提供的api是异步的,这意味着结果在将来的某个时间点是预期的,但不是立即的。一旦结果可用,就会调用回调函数并获得结果。

如果你来自同步编码背景,它就是一种范式转换。你需要改变主意思考异步。

答案 1 :(得分:0)

可能我迟迟没回答这个问题。我已经开始使用nodejs并且我使用MongoDB存储所有数据,我遇到了同样的问题,找到了将文档保存在变量中的解决方案。

正如您所知,查询是异步的,因此您不能将结果分配给变量,而不是这样做,您必须使用函数作为回调并在那里返回值。

以下是我在项目中使用的示例代码:

var verifyUserExists = function(db, callback, username) {

  var collection = db.collection('users');

  collection.findOne({ 'login': username }, function(err, doc) {
    assert.equal(null, err);
    callback(doc);
  });

}

mongoClient.connect(mongoUrl, function(err, db) {
  assert.equal(null, err);
  console.log('Connected successfully to server');

  verifyUserExists(db, function(userExists) {
    console.log(userExists);
    db.close();
  }, username);
});

如果要对返回的文档执行其他操作,则必须在回调中执行此操作,如果尝试将回调函数中的值返回到全局变量,则将获得undefined,因为代码为执行异步。