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

Javascript 在MongoDB中更新数组中的多个值,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我收到一个jsonObject并希望执行Mongo DB更新: jsonObject:“tablename”:“1”,“inventar”:[{“ean”:“802.6180.222”},{“ean”:“657.7412.878”} 现有文件(简称): 我需要为数组中的每个对象(在invetar jsonObject中)将接受的值设置为“1” 守则: app.post('/in_accept', function(request,response){ var jsonString=request

我收到一个jsonObject并希望执行Mongo DB更新:

jsonObject:
“tablename”:“1”,“inventar”:[{“ean”:“802.6180.222”},{“ean”:“657.7412.878”}

现有文件(简称):

我需要为数组中的每个对象(在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”

感谢

除了通过
.findOne()
或variant检索对象,然后在代码中进行修改并调用
.save()
(这不被认为是“理智的”,因为一致性问题会使这种方法成为“心智的”)之外,唯一真正“理智的”方法是执行“多重”更新,或者基本上为每个要更改的阵列成员更新一次

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

这确保两个请求在一个请求和一个响应中同时发送到服务器


.find()
中的每个“查询”都匹配数组中的一个元素,并通过p返回它的“索引”值,p在方法的“更新”部分中用于匹配索引位置的值。

谢谢,它的工作方式与epxected类似。每次我更深入地使用MongoDB时,它都很可怕。它周围有这么多api…@Piet我个人觉得它很简单。就像我知道我经常希望更新多个东西一样,比如你想要的东西,那么我要么接受上面的多个更新过程,要么使用另一个集合,我可以使用
{“multi”:true}
进行更新。我取决于什么对我最有效。我有多年的SQL关系管理经验(不年轻),我使用NoSQL解决方案,如MongoDB,以更好地适应关系模型不适用的情况。否则,我使用关系引擎。
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});
});
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
   }
})