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



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

我认为我得到的最接近的是

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

其中 path 是保存一个文档的集合,但随后 console.log(path[0]) 返回未定义。

尝试异步方式,如下所示

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

注意
切勿尝试在节点中同步运行 IO 操作.js因为 node.js 是单线程的。如果这样做,则会阻止整个应用程序。mongodb nodejs native提供的API是异步的,这意味着结果预计在未来的某个时间点,但不会立即出现。一旦结果可用,就会调用回调函数并得到结果。

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

可能我回答这个问题迟到了。我已经开始使用 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,因为代码是异步执行的。

最新更新