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

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

看来我们可以像这样访问驱动程序的数据库对象。

  YourModel.db.db 

有兴趣知道是否有更多的mongoose友好的方式去呢?

对于mongoose直接没有具体实现这个权利。 但是在编写mongoose API的时候,它仍然是build立在本地驱动程序的基础之上的,它使得.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() ,所以这个工作原理比原始的命令格式清晰一些。 这究竟是什么,这将打破引擎盖下。

但要小心,基本驱动程序方法不能像mongoose方法实现一样工作。 最大的区别在于与数据库的连接。 mongoose之间的连接方式以及如何在连接callback之外调用语句意味着在尝试执行任何操作之前,自己的方法会“等待”该连接。

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