3

我正在尝试开发一个同步服务器(想想: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/

注意:我不是在看批量插入或更新,因为正在处理的每个文档都需要单独处理。有些可能需要插入,有些更新,然后是版本号和同步状态检查等。

4

1 回答 1

5

您可能想为此尝试异步模块。它有一些非常有用的方法来处理集合中的每个项目,并提供所有处理完成时的功能。

我特别向您推荐队列功能,它允许您将任务添加到队列中,然后在处理完所有项目后,执行一些操作。

例如,您可能会执行以下操作:

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 中处理的每个文档的特定状态,这完全有可能像这样。只要您在队列外实例化一个数据结构,您就可以在处理每个项目时向其添加状态代码(等),并在队列的排水函数中将该结构发送给客户端。应该不会太麻烦。

于 2013-09-30T11:39:28.017 回答