我收到一个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”。
由于
答案 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}}匹配的索引位置的值。