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

时间:2015-01-15 15:31:37

标签: javascript node.js mongodb mongoose

我在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

有兴趣知道是否有更多的猫鼬友好的方式去做?

1 个答案:

答案 0 :(得分:2)

对于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
});

此外,还有所有其他方法可以包含在“批量”批处理中,例如.insert().remove(),因此这比原始命令表单更清晰。实际上,这将把它分解为引擎盖。

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

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