【问题标题】: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()。