在MongoDB中更新数组中的多个值

时间:2015-07-25 11:47:19

标签: javascript node.js mongodb mongoose

我收到一个jsonObject并想要执行Mongo-DB更新:

jsonObject:"tablename":"1","inventar":[{"ean":"802.6180.222"},{"ean":"657.7412.878"}]}

现有文件(缩写):

"tablename": "1",
"accepted": false,
"inventar": [
    {
        "ean": "802.6180.222",
        "accepted": "0"
    },
    {
        "ean": "657.7412.878",
        "accepted": "0"
    }
],

我需要为Array中的每个对象(在invetar-jsonObject中)将接受的值设置为“1”。

守则:

app.post('/in_accept', function(request,response){
var jsonString=request.body.json;
var jsonObj = JSON.parse(jsonString);
var InUser = jsonObj.in_user;
var InDate = jsonObj.in_date;
var inventar = jsonObj.inventar; //is an Array
var tablename = jsonObj.tablename;
console.log(inventar);
var query = {"tablename": tablename};
var update = {"accepted": true, CODE FOR UPDATING INVENTAR};
var options = {"upsert": false, "new": true};
        Move.findOneAndUpdate(query, update, options,
        function(err,Move) {
            console.log( Move );
        });
response.json({"success": true});
});

我知道mongoDB为运营商提供了“each”,但我坚持使用整个语法。 对于每个“ean”,接受的值应设置为“1”。

由于

1 个答案:

答案 0 :(得分:1)

除了通过.findOne()或变体检索对象,然后在代码中进行修改并调用.save()(不被视为“理智”作为可靠性问题)时,唯一真正“理智”的方法juyst使这种方法“精神”,是执行“多个”更新,或者基本上为每个要更改的数组成员更新。

您的“最佳”方法是立即进入核心驱动程序并访问Bulk Operations API方法:

var input = { "tablename":"1","inventar":[{"ean":"802.6180.222"},{"ean":"657.7412.878"}]},
    bulk = Move.collection.initializeOrderedBulkOp();

// Build the statements
input.inventar.forEach(function(inventar) {
    bulk.find({ 
       "tablename": input.tablename,
       "inventar.ean": inventar.ean
    }).updateOne({
        "$set": { "inventar.$.accepted": 1 }
    });
});

// Then execute
bulk.execute(function(err,result) {
   if (!err) {
      response.json({ "sucess": true })
   } else {
      // handle error
   }
})

确保两个请求在一个请求中同时发送到服务器,并且只有一个响应。

来自.find()的每个“查询”与数组中的元素匹配,并通过p ositional $ operator返回它的“index”值,该值在方法的“update”部分中用于{ {3}}匹配的索引位置的值。