nodejs,mongodb – 如何操作来自多个查询的数据?

一般来说,我是新来的JS,但我试图从MongoDB查询一些数据。 基本上,我的第一个查询检索具有指定的会话ID会话的信息。 第二个查询对位于指定位置附近的文档执行简单的地理空间查询。

我正在使用mongodb原生的javascript驱动程序。 所有这些查询方法在callback中返回结果,所以它们是非阻塞的。 这是我的烦恼的根源。 我需要做的是检索第二个查询的结果,并创build一个所有返回文档的sessionIds数组。 然后我将在稍后将这些函数传递给一个函数。 但是,我不能生成这个数组,并在callback之外的任何地方使用它。

有没有人有任何想法如何正确地做到这一点?

db.collection('sessions', function(err, collection) { collection.findOne({'sessionId': client.sessionId}, function(err, result) { collection.find({'geolocation': {$near: [result.geolocation.latitude, result.geolocation.longitude]}}, function(err, cursor) { cursor.toArray(function(err, item) { console.log(item); }); }); }); 

函数是唯一的东西在“封闭”范围的JavaScript。

这意味着内部callback函数中的variables项目在外部作用域上不可访问。

您可以在外部范围中定义一个variables,以便所有内部variables都可以看到:

 function getItems(callback) { var items; function doSomething() { console.log(items); callback(items); } db.collection('sessions', function(err, collection) { collection.findOne({'sessionId': client.sessionId}, function(err, result) { collection.find({'geolocation': {$near: [result.geolocation.latitude, result.geolocation.longitude]}}, function(err, cursor) { cursor.toArray(function(err, docs) { items = docs; doSomething(); }); }); }); }); } 

Node.js是asynchronous的,所以你的代码应该被写入来匹配它。

我发现这个模型很有用。 每个嵌套的callback混乱都包装在助手函数中,该函数使用错误代码和结果调用参数callback“next”。

 function getSessionIds( sessionId, next ) { db.collection('sessions', function(err, collection) { if (err) return next(err); collection.findOne({sessionId: sessionId}, function(err, doc) { if (err) return next(err); if (!doc) return next(false); collection.find({geolocation: {$near: [doc.geolocation.latitude, result.geolocation.longitude]}}.toArray(function(err, items) { return next(err, items); }); }); }); } 

然后在你的调用代码

 getSessionIds( someid, _has_items); function _has_items(err, items) { if( err ) // failed, do something console.log(items); }