在一个查询中进行mongoose多次更新

时间:2015-09-23 17:52:30

标签: node.js mongodb mongoose

请以任何方式在mongoose中执行此查询吗?

可以从mongodb v2.6

进行多次更新
{
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> }
}

我找到了这个话题,但它很老了:Mongodb multi update with different value

thx everyone for suggetions

2 个答案:

答案 0 :(得分:1)

根据您提供的详细信息,我假设您希望根据几个不同的条件和每个特定查询的特定更新值发布一系列更新查询。

然而,在更新MongoDB中的多个文档时,我将讨论两种可能的情况。

正如我之前提到的,如果您想要更新多个文档,有两种可能的情况:

  • 更新符合一组特定条件的多个文档,例如,您可以使用db.collection.update(),在触发操作时指定multi参数Official MongoDB Docs
  • 使用bulk.find.update()链接多个multi update操作并批量执行Official MongoDB Docs

答案 1 :(得分:0)

好的这些是结果

var p_text_data = require("../public/import/p_100_k_text_cz.json"); //data with new vals
_und.map(p_text_data,function(vals,index) {

        var new_name = vals.name + something;

        e_textModel.collection.update({ 'id': vals.id }, { $set: { 'name': new_name } }, {upsert: false, multi: true}); 

});

每次迭代使用sinle更新,更新100k文档大约需要7秒以上

和下一个代码,使用批量,花费不到3秒

var bulk = e_textModel.collection.initializeUnorderedBulkOp();
_und.map(p_text_data,function(vals,index) {
    ite++;

    var new_name = vals.name + something;

    bulk.find( { 'id': vals.id } ).update( { $set: { 'name': new_name } } );

});
bulk.execute();

修改

$var bulk = e_textModel.collection.initializeOrderedBulkOp();
在这种情况下,

比UnorderedBulkOp快几倍