【问题标题】:Does mongoose ordered Model.insertMany write anything to the db if it fails?如果失败,猫鼬订购的 Model.insertMany 是否会向数据库写入任何内容?
【发布时间】:2019-03-16 19:48:29
【问题描述】:

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

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

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

是吗:

  • 有一个错误并且没有将文档写入数据库。 (我想要的)

  • 写错误之前发生的文档,有错误,就不要再写文档了?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    options.ordered = true(默认):

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

    请注意,这是验证,而不是它在插入期间处理异常的方式。

    如果所有文档都通过验证,那么来自MongoDb docs:

    排除 Write Concern 错误,有序操作 在一个 错误,而无序操作继续处理任何剩余的 在队列中写入操作。

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

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

    ordered 为 false 时,插入操作将继续 剩余文件。

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

    options.ordered = false:

    由于您明确指定您不关心插入顺序,它会继续插入并简单地跳过有例外的那些。

    同样来自MongoDB docs

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 2018-10-09
      • 2016-10-13
      • 2014-07-12
      • 2013-04-25
      • 2017-01-16
      • 1970-01-01
      相关资源
      最近更新 更多