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

我收到一个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提供运营商“每个”,但我卡住了整个语法。 对于每个“ean”,可接受的值应该设置为“1”。

谢谢

除了通过.findOne()或变体来检索对象,然后在代码中调用和调用.save() (这不被认为是“理智的”,因为协调问题使得这种方法变得“精神“),是执行”多个“更新,或者对于每个想要更改的arrays成员来说基本上是一个更新。

您的“最佳”方法是立即转入核心驱动程序并访问批量操作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()中的每个“查询”匹配数组中的一个元素,并通过命题$操作符返回它的“索引”值,该操作符在方法的“更新”部分使用,以$set匹配的值指数位置。