如何更新数组内对象内的值。我将在变量中提供确切的数组编号...继承我的代码:
var num = 0;
var ObjectID=require('mongodb').ObjectID;
db.collection('polls').findAndModify({
query: {_id: ObjectID(_id param)},
update: { $inc: { total: 1, "Data.chart." + num.toString + ".value": 1} }
});
这就是我想要更新的内容
{total: 0, "Data": [
{ value: 0, label: 'Beatles', color: '#4169E1' },
{ value: 0, label: 'Sting', color: '#C0C0C0' },
{ value: 0, label: 'Police', color: '#FFA500' },
{ value: 0, label: 'Journey', color: '#FF4500' },
{ value: 0, label: 'Genesis', color: '#EE82EE' }
]
}
答案 0 :(得分:1)
您似乎在查询中有一个小节chart
,在要更新的实际数据中不存在。只是消除它;
db.collection('polls').findAndModify({
query: {_id: ObjectID(_id param)},
update: { $inc: { total: 1, "Data." + num.toString + ".value": 1} }
});
将查询转换为
db.polls.update({}, { $inc: { total: 1, "Data.2.value": 1} })
导致
db.polls.find().pretty()
{
"_id" : ObjectId("56cbebb6ef788d178e2dfdc0"),
"total" : 1,
"Data" : [
...
{
"value" : 1,
"label" : "Police",
"color" : "#FFA500"
},
...
答案 1 :(得分:0)
JavaScript"字符串化"提供钥匙,所以这就是为什么你没有得到你期望的。
将变量用作"计算出的密钥名称的一部分"您需要使用括号[]
表示法来定义对象:
var num = 0;
var update = { "$inc": { "total": 1 } };
update["$inc"]["Data." + num + ".value"] = 1;
db.collection('polls').findAndModify({
query: { _id: ObjectID(_id param) },
update: update
});
更好的是,你不应该假设"索引"您认为要修改的是数据的实际位置。而是匹配查询中的数组元素并使用位置$
运算符而不是硬索引:
db.collection('polls').findAndModify({
query: { "_id": ObjectID(_idParam), "Data.label": 'Beatles' },
update: { "$inc": { "total": 1, "Data.$.value": 1 } }
});
因此,将Data.label
与"Beatles"
匹配的元素将是更新的元素,而不管数组中当前的索引位置如何。
这意味着"可扩展",其他写入可能会改变阵列内容,但您仍在更新所需的内容,即使它因为另一次更新而改变了位置。
N.B 您问题中的文档的数组元素路径为Data
而不是Data.chart
。但是,但是应用你的真实数据是构建的。