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

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

我在 mongodb docs 中看到可以在单个更新命令中发送多个更新语句。您将如何使用 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

想知道是否有更友好的 mongoose 方式来解决这个问题?

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

因此 Bulk 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
});

此外,还有所有其他方法可以包含在 "bulk" 批处理中,例如 .insert().remove(),因此这比原始命令形式更简洁.这实际上就是将其分解为引擎盖下的内容。

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

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