当前位置: 首页 > 知识库问答 >
问题:

如何在Mongoose/Node.js中同时保存多个文档?

梁丘俊材
2023-03-14

目前,我使用保存来添加单个文档。假设我有一个希望存储为单个对象的文档数组。有没有一种方法添加他们所有与一个单一的函数调用,然后得到一个单一的回调,当它完成?我可以单独添加所有文档,但管理回调以确定何时完成所有操作会有问题。

共有3个答案

卢开济
2023-03-14

Mongoose还没有实现批量插入(参见问题#723)。

由于您知道要保存的文档数量,因此可以编写如下内容:

var total = docArray.length
  , result = []
;

function saveAll(){
  var doc = docArray.pop();

  doc.save(function(err, saved){
    if (err) throw err;//handle error

    result.push(saved[0]);

    if (--total) saveAll();
    else // all saved here
  })
}

saveAll();

当然,这是一个权宜之计,我建议使用某种流控制库(我使用q,它很棒)。

万嘉石
2023-03-14

Mongoose4.4添加了一个名为insertMany

验证文档数组并将其插入MongoDB(如果它们都有效)的快捷方式。这个函数比. create()更快,因为它只向服务器发送一个操作,而不是每个文档一个操作。

引用第723期中的vkarpov15:

折衷是insertMany()不会触发预保存挂钩,但它应该具有更好的性能,因为它只对数据库进行一次往返,而不是对每个文档进行一次。

该方法的签名与create相同:

Model.insertMany([ ... ], (err, docs) => {
  ...
})

或者,用promise:

Model.insertMany([ ... ]).then((docs) => {
  ...
}).catch((err) => {
  ...
})
谭毅然
2023-03-14

Mongoose现在支持将多个文档结构传递给Model.create.引用他们的API示例,它支持传递数组或varargs对象列表,并在末尾进行回调:

Candy.create({ type: 'jelly bean' }, { type: 'snickers' }, function (err, jellybean, snickers) {
    if (err) // ...
});

var array = [{ type: 'jelly bean' }, { type: 'snickers' }];
Candy.create(array, function (err, jellybean, snickers) {
    if (err) // ...
});

编辑:正如许多人所指出的,这并没有执行真正的批量插入——它只是隐藏了多次调用保存的复杂性。下面有答案和注释,解释了如何使用实际的Mongo驱动程序来实现大容量插入,以提高性能。

 类似资料:
  • 问题内容: 目前,我使用保存添加单个文档。假设我有一组文档希望存储为单个对象。有没有一种方法可以通过单个函数调用将它们全部添加,然后在完成后获得单个回调?我可以单独添加所有文档,但是管理回调以解决所有问题。 问题答案: 猫鼬尚未实现大容量插入(请参阅问题#723)。 由于您知道要保存的文档数量,因此可以编写如下内容: 当然,这是一个权宜之计,我建议您使用某种流控制库(我使用q很棒)。

  • 问题内容: 以上似乎不起作用。记录仍然存在。 有人可以修复吗? 问题答案: 是一系列文档。所以它没有方法 您可以分别迭代和删除数组中的每个文档。 或-由于看起来您是通过(可能是)唯一的ID查找而不是来查找文档的。

  • 我想通过猫鼬进行API调用,以将一批选定的(下面的模式)子文档的日期字段更新为当前日期。 Player模式: 我创建了一个复选框,用户可以在其中选择多个(以及他们的数组中的特定'卡片'子文档),并将所有选定的的特定卡片的日期更改为相同的日期...作为反应,我将相应的ObjectIds在主体中批处理在一起,并将选定的玩家/卡片组合发送到一个对象数组中,如下所示(其中数字表示相同的分组玩家 我正在发送

  • 我在将柱状图从“for循环”保存到多个pdf文件时遇到问题。 我已经试过了。savefig()和img2pdf。 我要么保存一个绘图,要么一个也不保存。我想将每个dist[I]保存到pdf文件中。最后一行没有真正起作用。。。

  • 问题内容: 我正在用Node.js和猫鼬编写一个Webapp。如何对通话结果进行分页?我想要一个与SQL 相当的功能。 问题答案: 在通过Rodolphe提供的信息仔细研究了Mongoose API之后,我想出了以下解决方案:

  • 我的模式是 在这个模式中,“uid”代表用户标识符,而“答案”数组存储学生回答的答案。在每个答案中,qid与问题ID相关,“内容”是学生的真实答案,“时间”是答案的修改时间戳。 在这里,我使用mongoose将新答案插入到数组中 一般来说,通过使用addToSet命令,应答数组中的元素应该是唯一的,但在我的示例中,应答数组只能有多个相同的嵌入文档,除了每个嵌入文档都有一个唯一的OjbectId\u