2017-02-26 62 views
0

我无法从调用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); 

它看起来像我试图在循环完成之前记录数据。但如何同步时间? 如果有人能向我解释这一点,我会非常感激,因为我一直盯着这个东西好几天,真的很蠢。

回答

0

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

您应该使用回调函数来获取结果。如果你不确定这些是什么,你需要学习mongo/node在任何地方使用它们。基本上,javascript被设计为运行速度非常快,并且不会等到完成某些任务才能完成下一行代码。

本教程帮了我很多,当我第一次学习:https://zellwk.com/blog/crud-express-mongodb/

你能不能让我们知道什么样的环境运行此蒙戈的要求吗?它会给更多的上下文,因为现在我不知道你是如何使用mongo的。

0

感谢您的快速响应。

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

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

我取代了代码末,在connect()用下面的代码后:

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

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

  1. 顺序处理(因为我本来concieved) - 我将不得不把某种时间延迟,让DB调用结束之前开始。

  2. 与该需要做,并在数据库返回的数据从数据库里面回调调用它的处理所有的代码创建一个函数。

第一个选项有点臭。我不想在制作中看到这个,所以我想我会选择第二个选项。

感谢您推荐的链接。对于我来说,我做了一个快速的观察,问题在于这是描述了一种非常常见的模式,它依靠快速监听路由器呼叫来响应。我正在做的处理与路由器呼叫无关。

啊同步io的好日子啊。

+0

您的选择是正确的。您的不情愿与选项1一起完全正确。 – JohnnyHK