我需要更新集合中的多个文档,但每次更新都是逻辑驱动的,并且不统一。换句话说,我不想对每个受影响的文档应用 * 相同的更新 *。每个文档的更改都将由系统上的某些逻辑驱动。
执行此逻辑后,我得到了一个文档数组,这些文档在应用程序空间中使用标准JS操作进行了编辑,例如:
someDocument.someField = "some new value";
someDocument.someRef = otherDocument._id;
editedDocs.push(someDocument);
然后我通常会这样做:
for (let i = 0; i < editedDocs.length; i++) {
await editedDocs[i].save({session});
}
我把更新放到一个事务中,这样它们就可以原子地成功/失败了。但是我注意到这种方法很慢,一次编辑大约200个文档需要大约15秒才能完成。
我需要的是在一次函数调用中保存editedDocs数组中所有文档的能力。
这样的召唤存在吗?
谢谢你!
1条答案
按热度按时间nle07wnf1#
@R2D2以评论的形式回答了我的问题。
它实际上为我指明了正确的方向。我想要的操作实际上是Model.bulkSave(),它最终使用Model.bulkWrite()。
我还必须将Mongoose从5.x更新到最新版本,因为5.x版本中的Model.bulkSave()不支持事务,而在6.x版本中支持事务,因此我可以在一次调用中保存在应用程序空间中编辑的多个文档,而无需在事务中循环,这满足了我的所有要求。
有关详细信息,请参阅此处:https://mongoosejs.com/docs/api/model.html#model_Model-bulkSave
感谢@R2D2