使用变量访问嵌套数组中的嵌套对象(MongoDB,Node,Inc)

时间:2017-03-19 17:54:58

标签: javascript node.js mongodb

我知道这个问题的无数相关主题,但似乎没有人回答我的问题。它与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相反,它已经创建了一个新属性。

有没有办法用这样的变量访问数组索引?

2 个答案:

答案 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中完成数组更新的。