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

3
我很难找到应该很简单的东西的解决方案...我想在mongo数据库中找到一个文档,并将其存储在一个变量中,以便我可以在node.js应用程序的任何地方使用它。
我认为我已经接近了最接近的解决方案:
var path = db.collection('paths').find().toArray()

在这里,路径是一个包含一个文档的集合,但是 console.log(path[0]) 返回未定义。


2
从mongodb中查找文档是异步的,因此通常不会将函数的返回值分配给变量,而是将回调传递给查询结果的回调函数,正如您在这些示例中所看到的 https://github.com/mongodb/node-mongodb-native#find-all-documents。 - mzulch
这可能会有所帮助: https://dev59.com/NaPia4cB1Zd3GeqP0pSX#45201528 - user1063287
2个回答

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原生提供的API是异步的,这意味着结果预计在未来的某个时间点到达,但不是立即的。一旦结果可用,回调函数就会被调用,您就可以获得结果。

如果您来自同步编码背景,则需要进行范式转变。您需要改变思考方式,以异步方式思考。


1
这对我仍然不起作用,结果在toArray方法中记录得非常好,但是在它之外,路径仍然未定义。 - jjames
1
这就是为什么它被称为异步。为什么需要在回调块之外设置路径? - user1481317
此外,您不能将其放在回调块之外。您需要等待结果接收并在回调内执行所有逻辑。 - Vivek Athalye

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,因为代码是异步执行的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接