猫鼬是否命令Model.insertMany将任何内容写入数据库(如果失败)?

时间:2018-10-11 16:32:18

标签: node.js mongodb mongoose

在Model.insertMany的文档中,它说,当options.ordered == true时,该方法将在第一次错误时失败。

https://mongoosejs.com/docs/api.html#model_Model.insertMany

  

[options.ordered«Boolean»= true]如果为true,将在   遇到第一个错误。如果为false,将所有文件插入   可以并稍后报告错误。具有order = false的insertMany()是   称为“无序” insertMany()。

这样做:

  • 有错误,并且没有向db写任何文档。 (我想要什么)

  • 写出发生在错误之前的文档,出现错误,然后不再写文档?

1 个答案:

答案 0 :(得分:2)

options.ordered = true(默认值):

  

猫鼬总是在将 insertMany 发送到   MongoDB。因此,如果一个文档存在验证错误,则不会有任何文档   保存,除非您将 ordered选项设置为false

请注意,这是验证方式,而不是它在插入过程中如何处理异常的方式。

如果所有文档均通过验证,则来自MongoDb docs

  

排除“写入问题”错误,有序操作   错误,而无序操作继续处理   在队列中写入操作。

请注意insertMany示例下的最后一段:

  

请注意,已插入一个文档 :_id的第一个文档:13   将成功插入,但第二次插入将失败。 这将   还可以阻止插入队列中剩余的其他文档

     

如果命令设置为false,则插入操作将继续执行   剩余文件。

您似乎暗示您需要transactional approach。为此,您应该查看into this并查看您的MongoDB版本是否支持它。

options.ordered = false:

由于您明确指定您不关心插入顺序,因此它将继续插入并仅跳过有例外的情况。

也来自MongoDB docs

  

如果将ordered设置为false,则文档将以无序方式插入   格式,mongod可以重新排序以提高性能。   如果使用   无序insertMany()。