0

I am aware of the myriad of related topics to this question but none seem to answer my problem. It is related to Node and Mongo but I think this is a general Javascript issue.

In MongoDB I need to access the options array with a variable giving the index number and then increment it's votes property. An example would be:

{
    "_id": {
        "$oid": "58ce7c6c39aff90a7c66b0d4"
    },
    "question": "Test",
    "options": [
        {
            "answer": "answer1",
            "option": "Bob Dylan",
            "votes": 2
        },
        {
            "answer": "answer2",
            "option": "Bob Geldof",
            "votes": 0
        }
    ]
}

I then get the index of the array I need to update like so:

var votedFor = "answer2";
votedFor = votedFor.match(/\d+/)[0];
var index = parseInt(votedFor) - 1;

Which I then assume the path to the integer to increment would be:

var inc = {};
inc["options[" + index + "].votes"] = 1;

Which I would like to pass in like so:

db.collection('questions')
.findOneAndUpdate({"_id": questionId}, {$inc : inc }, (err, result) => {
  if (err) return res.send(err)
  res.send(result)
})

Which updates the db like so:

    {
        "_id": {
            "$oid": "58ce7c6c39aff90a7c66b0d4"
        },
        "question": "Test",
        "options": [
            {
                "answer": "answer1",
                "option": "Bob Dylan",
                "votes": 2
            },
            {
                "answer": "answer2",
                "option": "Bob Geldof",
                "votes": 0
            }
    ],
    "options[1]": {
        "votes": 1
    }
}

Which, as you can see, as opposed to incrementing options[1].votes it has created a new property instead.

Is there any way of accessing the array index with a variable like this?

swhizzle
  • 141
  • 10
  • Possible duplicate of [MongoDB - Update objects in a document's array (nested updating)](http://stackoverflow.com/questions/10522347/mongodb-update-objects-in-a-documents-array-nested-updating) – s7vr Mar 19 '17 at 18:49

2 Answers2

2

Read about Positional Operator for handling array updates,

db.collection.update({'_id': questionId, 'options.answer':'answer2'},{"$inc":{"options.$.votes":1}})
Amitesh
  • 992
  • 7
  • 11
1

Instead of doing:

var inc = {}; inc["options[" + index + "].votes"] = 1;

You should do:

var inc = {}; inc["options." + index + ".votes"] = 1;

So, you should not use options[0].votes, but options.1.votes, that's how array updates are done in MongoDB.

Michal Fudala
  • 340
  • 2
  • 10