从MongoDB调用中获取数据

时间:2017-02-26 20:31:41

标签: node.js mongodb

我无法从调用MongoDB的数据中检索数据。 调用工作正常,因为我可以向控制台显示结果,但是当我尝试将这些结果写入/复制到外部数组以便它们可用于我的程序时,在通话之外,我什么也得不到。 我见过的每个例子都在连接循环中完成所有工作。我找不到任何将结果复制到数组(全局或传入),连接结束,程序继续处理外部数组的示例。

大多数示例代码都是过于简单化(即只是连接循环中的console.log)或者过于复杂,以及如何制作快速api路由的示例。我不需要这个,因为我正在进行老式的串行批处理。 我知道Mongo是异步构建的,但我仍然可以使用它。

MongoClient.connect('mongodb://localhost:27017/Lessons', function (err, db) {
    assert.equal(err, null);
    console.log("Connectied to the 'Lessons' database");
    var collection = db.collection('students');
    collection.find().limit(10).toArray(function(err, docs) {
        // console.log(docs);
        array = docs.slice(0);    //Cloning array
        console.log(array);
        db.close();
    });
 });
console.log('database is closed');
console.log(array);

看起来我正在尝试在循环完成之前记录数据。但是如何同步时机? 如果有人可以向我解释这一点,我会非常感激,因为我已经盯着这些东西好几天了,我真的感觉很蠢。

2 个答案:

答案 0 :(得分:0)

从您共享的代码中,您希望数组在最后的console.log中显示吗?这不适用于您当前的设置,因为2 console.log将在对数据库的查询完成之前运行。

您应该使用回调功能获取结果。如果你不确定那些是什么,你将需要学习mongo / node在任何地方使用它们。基本上javascript被设计为运行得非常快,并且在进入下一行代码之前不会等待完成某些事情。

在我第一次学习时,本教程对我帮助很大:https://zellwk.com/blog/crud-express-mongodb/

您能告诉我们您运行此mongo请求的环境是什么吗?它会提供更多背景,因为现在我不确定你是如何使用mongo的。

答案 1 :(得分:0)

感谢您的快速反应。

环境是Windows7,mongod实例在后台运行,所以我连接到localhost。我正在使用我创建的数据库,但您可以使用任何集合来运行示例代码。

我说过我认为这是时间问题。您的观察结果“最终的2个console.log将在对数据库的查询完成之前运行”,这真的为我解释了这个问题。

我在connect()之后用以下代码替换了代码:

function waitasecond(){
    console.log(array);
}
setTimeout(waitasecond, 2000);

阵列已完全填充。这表明我试图做的事情,至少是我想做的事情,是不可能的。我想我有两个选择。

  1. 顺序处理(正如我最初所说) - 在开始之前,我必须花费一些时间延迟让db调用完成。

  2. 使用所有需要处理的代码创建一个函数,并在数据库返回数据时从数据库回调内部调用它。

  3. 第一个选择有点臭。我不想在生产中看到它,所以我想我会选择第二种选择。

    感谢您推荐的链接。我快速浏览了一下,对我来说问题是,这是一个非常常见的模式,它依赖于快速侦听路由器调用来响应。我正在进行的处理与路由器调用无关。

    啊,对于同步的好时光。