如果猫鼬命令 Model.insertMany 失败,是否会向数据库写入任何内容?

Nic*_*den 1 mongoose mongodb node.js

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

\n\n

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

\n\n
\n

[options.ordered \xc2\xabBoolean\xc2\xbb = true] 如果为 true,则在遇到第一个错误时快速失败。如果为 false,将插入它可以插入的所有文档并稍后报告错误。ordered = false 的 insertMany() 称为“无序”insertMany()。

\n
\n\n

可以:

\n\n
    \n
  • 出现错误并且没有向数据库写入任何文档。(我想要什么)
  • \n
\n\n

或者

\n\n
    \n
  • 写文件之前发生的错误,有错误,然后不再写文件?
  • \n
\n

Akr*_*ion 5

options.ordered = true (默认值):

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

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

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

排除 Write Concern 错误,有序操作在发生错误后停止,而无序操作继续处理队列中任何剩余的写操作。

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

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

如果命令为 false,则插入操作将继续处理任何剩余文档。

您似乎暗示您需要一种事务性方法。为此,您应该查看此内容并查看您的 MongoDB 版本是否支持它。

选项.ordered = false:

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

同样来自MongoDB 文档

如果ordered设置为false,文档将以无序格式插入,并且可以由mongod重新排序以提高性能。如果使用无序的 insertMany(),应用程序不应依赖于插入的顺序。