使用 Node.js monk 和 MongoDB 链接嵌套异步查找
Chaining nested asynchronous finds with Node.js monk and MongoDB
使用Node.js僧侣和MongoDB,我想模仿一个table加入:
- 查找集合 A
- 对于每个结果 X,在集合 B 中进行查找,并更新 X
- Return 更新结果列表
monk 中数据库命令的异步特性给我带来了麻烦。
这是我的初始代码。它不起作用,因为第二次调用 find
returns 立即承诺,
并且 xs
中的结果在更新之前在响应中发送。
var db = require('monk')('localhost/mydb');
db.get('collection').find({}, function(e,xs) {
xs.forEach(function(x){
coll_b.find({a_id:x._id}, function(e,bs) {
a['bs'] = bs;
});
});
res.json({'results':as});
});
我觉得我应该在这里使用 promise 链,但我不知道该怎么做。
任何帮助将不胜感激。
我想我是这样解决的,灵感来自this answer:
var db = require('monk')('localhost/mydb');
// Initial find
db.get('collection').find({}, function(e,xs) {
// Get inner finds as a list of functions which return promises
var tasks = xs.map(function(x){
return function() {
return coll_b.find({a_id:x._id}, function(e,bs) {
a['bs'] = bs;
});
}
});
// Chain tasks together
var p = tasks[0](); // start the first one
for(var i = 1; i < tasks.length; i++) p = p.then(tasks[i]);
// After all tasks are done, output results
p.then(function(_x){
res.json({'results':xs});
});
});
我仍然觉得可以通过使用 chain()
来最小化此代码,但至少它按预期工作。
注意:我意识到对每个结果执行第二次查找不一定有效,但这不是我关心的问题。
使用Node.js僧侣和MongoDB,我想模仿一个table加入:
- 查找集合 A
- 对于每个结果 X,在集合 B 中进行查找,并更新 X
- Return 更新结果列表
monk 中数据库命令的异步特性给我带来了麻烦。
这是我的初始代码。它不起作用,因为第二次调用 find
returns 立即承诺,
并且 xs
中的结果在更新之前在响应中发送。
var db = require('monk')('localhost/mydb');
db.get('collection').find({}, function(e,xs) {
xs.forEach(function(x){
coll_b.find({a_id:x._id}, function(e,bs) {
a['bs'] = bs;
});
});
res.json({'results':as});
});
我觉得我应该在这里使用 promise 链,但我不知道该怎么做。 任何帮助将不胜感激。
我想我是这样解决的,灵感来自this answer:
var db = require('monk')('localhost/mydb');
// Initial find
db.get('collection').find({}, function(e,xs) {
// Get inner finds as a list of functions which return promises
var tasks = xs.map(function(x){
return function() {
return coll_b.find({a_id:x._id}, function(e,bs) {
a['bs'] = bs;
});
}
});
// Chain tasks together
var p = tasks[0](); // start the first one
for(var i = 1; i < tasks.length; i++) p = p.then(tasks[i]);
// After all tasks are done, output results
p.then(function(_x){
res.json({'results':xs});
});
});
我仍然觉得可以通过使用 chain()
来最小化此代码,但至少它按预期工作。
注意:我意识到对每个结果执行第二次查找不一定有效,但这不是我关心的问题。