gpt4 book ai didi

Node.js、MongoDB - 插入/更新多个文档并发送单个响应

转载 作者:可可西里 更新时间:2023-11-01 09:27:45 25 4
gpt4 key购买 nike

我正在尝试开发一个同步服务器(想想:类似 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 函数中将结构发送到客户端。应该不会太麻烦。

关于Node.js、MongoDB - 插入/更新多个文档并发送单个响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19092630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com