猫鼬 - 如何使用多个更新语句进行单个更新

Mongoose - How to do a single update with multiple update statements

本文关键字:更新 语句 单个 何使用 猫鼬      更新时间:2023-09-26

我在mongodb文档中看到可以在单个更新命令中发送多个更新语句。你会如何使用 Node.js 和 Mongoose 做到这一点?

db.runCommand({
    update: <collection>,
    updates:
      [
         { q: <query>, u: <update>, upsert: <boolean>, multi: <boolean> },
         { q: <query>, u: <update>, upsert: <boolean>, multi: <boolean> },
         { q: <query>, u: <update>, upsert: <boolean>, multi: <boolean> },
         ...
      ],
    ordered: <boolean>,
    writeConcern: { <write concern> }
})

似乎我们可以像这样访问驱动程序的 db 对象。

 YourModel.db.db

有兴趣知道是否有一种对猫鼬更友好的方法吗?

直接对于猫鼬,现在还没有具体的实现。但在编写时,猫鼬 API 仍然构建在节点本机驱动程序之上,这使得使用 .collection 访问器可以从模型中访问所有相同的方法。

因此,批量 API 方法随后可用:

var bulk =  Model.collection.initializeOrderedBulkOp();
var index = 0
// start some loop of statements
{
    bulk.find({ })             // find to match
        .updateOne({});        // update one      
    bulk.find({})
        .update({});           // applies to multi
    bulk.find({})
        .upsert().updateOne(); // marks an "upsert"
}
bulk.execute(function(err,response) {
    // response object has details of operations
});
此外,还有

所有其他方法可以包含在"批量"批处理中,例如 .insert().remove() ,因此这比原始命令表单更干净。这实际上是将其分解为引擎盖下的内容。

但请注意,基本驱动程序方法的工作方式与猫鼬方法实现的方式不同。最大的区别在于与数据库的连接。猫鼬的连接方式以及如何在连接回调之外调用语句意味着它自己的方法在尝试执行任何操作之前"等待"建立该连接。

所以你可以使用它,但你需要确保在调用此代码之前总是触发其他一些"猫鼬"方法。或者以其他方式放置在连接回调或所需的任何连接检测和保证方法中。