我正在尝试开发一种同步服务器(类似于 SVN),它在一个请求(JS 对象的 JSON 字符串化数组)中接受来自客户端的一个或多个文档(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/
注意:我不是在考虑批量插入或更新,因为正在处理的每个文档都需要单独处理。有些可能需要插入,有些需要更新,然后还有版本号和同步状态检查等。
您可能想尝试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);
})
}
专业提示:您需要推动一个物体含有将文档放入队列。如果您尝试传入未包装的对象,则会出现奇怪的错误。
现在,如果您想要在 Mongo 中处理的每个文档的特定状态,这是完全可能的。只要在队列外部实例化一个数据结构,就可以在处理每个项目时向其中添加状态代码(等),并将该结构发送到队列中的客户端drain功能。应该不会太麻烦。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)