Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 更新mongodb对象内部对象值的最佳方法_Javascript_Node.js_Mongodb_Express - Fatal编程技术网

Javascript 更新mongodb对象内部对象值的最佳方法

Javascript 更新mongodb对象内部对象值的最佳方法,javascript,node.js,mongodb,express,Javascript,Node.js,Mongodb,Express,这就是我在mongodb集合中存储每个元素的方式 { _id: 'iTIBHxAb8', title: 'happy birthday', votesObject: { happy: 0, birthday: 0 } } 我做了一件非常肮脏的工作,对此我一点也不感到骄傲,这是 //queryObject= {id,chosenvalue}; let queryObject = req.query; let id = Object.keys(queryObject)[0]; let

这就是我在mongodb集合中存储每个元素的方式

{
  _id: 'iTIBHxAb8',
  title: 'happy birthday',
  votesObject: { happy: 0, birthday: 0 }
}
我做了一件非常肮脏的工作,对此我一点也不感到骄傲,这是

//queryObject= {id,chosenvalue};
let queryObject = req.query;
let id = Object.keys(queryObject)[0];
let chosenValue = queryObject[id];
db.collection("voting")
            .find({ _id: id })
            .toArray((err, data) => {
                let { votesObject } = data[0];
                votesObject[chosenValue] += 1;
                data[0].votesObject = votesObject;
                db.collection("voting").replaceOne({ _id: id }, data[0]);
                res.redirect("/polls?id=" + id);
            });
基本上,它从上面的例子中得到选择的值,可能是“快乐”或“生日”

  • 从集合中查找与id匹配的完整对象
  • 从找到的对象中递增所选值
  • 使用replaceOne()将以前的对象替换为新更改的对象
每次执行这段代码时,我都会将所选值中的值递增1

这很好,但我想知道是否有任何方法可以直接更新所选的值,而不会造成混乱。我找不到在其他地方执行的方法。

您可以使用运算符

试着这样做:

db.collection.update({
“_id”:id
},
{
“$inc”:{
“votesObject.生日”:1
}
})
此查询将在一个字段中增加您的字段
生日

检查mongo游乐场示例

您可以使用运算符

试着这样做:

db.collection.update({
“_id”:id
},
{
“$inc”:{
“votesObject.生日”:1
}
})
此查询将在一个字段中增加您的字段
生日

检查mongo游乐场示例

您可以使用mongoose 大概是

const updateKey = "votesObject.$."+ chosenValue
let incQuery = {}
incQuery[updateKey] = 1

Model.findOneAndUpdate(
    { _id: id }, 
    { $inc: incQuery },
    { new : false }, 
    callback
)
你可以用猫鼬 大概是

const updateKey = "votesObject.$."+ chosenValue
let incQuery = {}
incQuery[updateKey] = 1

Model.findOneAndUpdate(
    { _id: id }, 
    { $inc: incQuery },
    { new : false }, 
    callback
)

使用
update
功能如果您指定的是findOneAndUpdate,我已经尝试过使用findOneAndUpdate。我不知道是否还有其他方法。如果是这样,那么我不确定它是如何工作的使用
update
函数如果您指定的是findOneAndUpdate,我已经尝试过使用findOneAndUpdate。我不知道是否还有其他方法。如果是这样的话,我不确定它是如何工作的。你很接近,我也是。但是这里选择的值不是特定的,它可以是存储在变量“chosenValue”中的任何东西。当我尝试执行“votesObject.”+chosenValue+“”:1As@Deepak Poojari发布时,这不起作用,解决方案是创建“查询对象”并执行查询。但我认为不能使用
$
运算符。顺便说一句,如果可以的话。你和我很亲近。但是这里选择的值不是特定的,它可以是存储在变量“chosenValue”中的任何东西。当我尝试执行“votesObject.”+chosenValue+“”:1As@Deepak Poojari发布时,这不起作用,解决方案是创建“查询对象”并执行查询。但我认为不能使用
$
运算符。顺便说一句,如果可行的话。你的答案非常完美。我刚把updateKey改为“votesObject”。+chosenValue,它就像一个魔咒一样工作。谢谢你,你的回答非常好。我刚把updateKey改为“votesObject”。+chosenValue,它就像一个魔咒一样工作。非常感谢。