我知道这个问题的无数相关主题,但似乎没有人回答我的问题。它与Node和Mongo有关,但我认为这是一个普遍的Javascript问题。
在MongoDB中,我需要使用给出索引号的变量访问options
数组,然后增加它的votes
属性。一个例子是:
{
"_id": {
"$oid": "58ce7c6c39aff90a7c66b0d4"
},
"question": "Test",
"options": [
{
"answer": "answer1",
"option": "Bob Dylan",
"votes": 2
},
{
"answer": "answer2",
"option": "Bob Geldof",
"votes": 0
}
]
}
然后我得到我需要更新的数组的索引,如下所示:
var votedFor = "answer2";
votedFor = votedFor.match(/\d+/)[0];
var index = parseInt(votedFor) - 1;
然后我假设要增加的整数的路径是:
var inc = {};
inc["options[" + index + "].votes"] = 1;
我想像这样传递:
db.collection('questions')
.findOneAndUpdate({"_id": questionId}, {$inc : inc }, (err, result) => {
if (err) return res.send(err)
res.send(result)
})
像这样更新数据库:
{
"_id": {
"$oid": "58ce7c6c39aff90a7c66b0d4"
},
"question": "Test",
"options": [
{
"answer": "answer1",
"option": "Bob Dylan",
"votes": 2
},
{
"answer": "answer2",
"option": "Bob Geldof",
"votes": 0
}
],
"options[1]": {
"votes": 1
}
}
正如您所看到的,与增加options[1].votes
相反,它已经创建了一个新属性。
有没有办法用这样的变量访问数组索引?
答案 0 :(得分:2)
阅读Positional Operator以处理数组更新,
db.collection.update({'_id': questionId, 'options.answer':'answer2'},{"$inc":{"options.$.votes":1}})
答案 1 :(得分:1)
而不是:
var inc = {};
inc["options[" + index + "].votes"] = 1;
你应该这样做:
var inc = {};
inc["options." + index + ".votes"] = 1;
因此,您不应该使用options[0].votes
,而应使用options.1.votes
,这是如何在MongoDB中完成数组更新的。