我正在尝试开发一个同步服务器(想想:SVN之类),它在一个请求中接受来自客户端的一个或多个文档(JSON字符串)(JS对象的JSON字符串化数组),将它们插入/更新为mongodb和发送一个响应 - 这是一个JSON字符串,包含每个文档的插入/更新状态(以及mongo中的_id等更多信息)。
如果它是一个文档,我本可以完成一次插入/更新,并且在其回调中,我本可以发送响应。
collection.insert(_data, function(error, result) {
if(error) res.send('error');
else res.send(JSON.stringify({result: result}));
});
但是当我有多个文档时如何做到这一点。我可以在前一个回调中插入/更新一个文档。但我担心,如果我这样做,我最终会得到一个可怕的代码阶梯(我可以在一个函数中执行并递归,是的)。
任何帮助将不胜感激。顺便说一下,我正在使用这个驱动程序:http://mongodb.github.io/node-mongodb-native/
注意:我没有查看批量插入或更新,因为正在处理的每个文档都需要单独处理。有些可能需要插入,有些更新,然后有版本号和&同步状态检查等。
答案 0 :(得分:5)
您可能需要尝试使用async模块。它有一些非常有用的方法来处理集合中的每个项目,并提供所有处理完成时的功能。
我特别推荐给queue函数,它允许你将任务添加到队列中,然后在处理完所有项目之后,执行某些操作。
例如,您可能会执行以下操作:
var q = async.queue(function(task, callback) {
// task.doc would contain your individual doc to process
// your insert / update logic goes here...
// Callback signifies you're done with this task
callback();
}, 2) // <--- this number specifies the number of tasks to run in parallel
q.drain = function() {
// this is the queue's callback, called when the queue is empty,
// i.e. when all your documents have been processed.
res.send(statusCode, message);
}
然后,如果我们假设您在名为 docs 的变量中包含了文档列表,那么您需要做的就是将它们全部推送到队列中。
for (var doc in docs) {
q.push({ doc: docs[doc] }, function(err) {
if (err) console.log(err);
})
}
Protip:您需要将包含文档的对象推送到队列中。如果你试图传入一个未包装的对象,那就有一个奇怪的错误。
现在,如果您想要在Mongo中处理的每个文档的特定状态,这样就完全可以了。只要您在队列外部实例化数据结构,就可以在处理每个项目时向其添加statusCodes(等),并将结构发送到队列的 drain 函数中的客户端。不应该太麻烦。