传递文档数组时,Mongoose 中 Model.create 的原子性

Posted

技术标签:

【中文标题】传递文档数组时,Mongoose 中 Model.create 的原子性【英文标题】:Atomicity of Model.create in Mongoose when passing an array of documents 【发布时间】:2013-05-22 22:34:28 【问题描述】:

所以我知道 MongoDB(以及代理 Mongoose)不支持事务,但涉及单个文档的操作是 always atomic。在查看 Mongoose 文档时,我遇到了 Model.create,它允许传递一组文档并将它们存储在单个操作中,如下所示:

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

这个动作是原子的吗? Mongo 是一次保存所有文档,还是 Mongoose ODM 循环遍历数组,一次保存一个文档?源(或源代码)将不胜感激。 (还有,我是新人,请不要拍!)

【问题讨论】:

【参考方案1】:

MongoDB Wire Protocol 接受单个文档或多个文档with OP_INSERT。但是,在服务器上,它们仍然一次插入一个。

换句话说,如果服务器在插入过程中发生崩溃,一些文档会被插入,而另一些则不会。在每个文档中,您都可以得到一致的视图 - 要么全部插入,要么没有。但是对于多个文档,不存在这样的保证。

【讨论】:

以上是关于传递文档数组时,Mongoose 中 Model.create 的原子性的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose `findOneAndUpdate` 回调不传递更新的文档

Mongoose `findOneAndUpdate` 回调不传递更新的文档

当填充涉及猫鼬时如何返回文档内容数组

mongoose 文档 queries

Mongoose 查找数组中包含字符串的所有文档

如何使用 Mongoose 查询过滤到数组类型字段中具有指定值的文档?