Let’s take a simple example: a TicTacToe gamefield saved as a nested array in MongoDB.
In the Collection a gamefield document has the following structure:
{
"_id" : ObjectId("5316267e427d71bf192dce61"),
"board" : [
[
"",
"",
""
],
[
"",
"",
""
],
[
"",
"",
""
]
]
}
Nothing special here.
But here comes the challenge:
How would you update the field board[1][2]
##The dot-notation
Check the reference for more info.
There is still a small issue after having discovered the documentation that seemed to save my day: I needed a dynamic string, not a hardcoded one.
So this wasn’t working, sadly, it would throw an error because dear Mongo tries to access to an undefined index ‘x’ and of this undefined index the key y:
gamesColl.update({_id: realId},{
$set: {
"board.x.y" : "X"
}
}, callback);
And I tried this one afterwards, but it isn’t a valid object, of course:
gamesColl.update({_id: realId},{
$set: {
"board."+x+"."+y : "X"
}
}, callback);
And yes, I tried to create the string outside of the update function. This would obviously not work because it sets the field “dotNotationString” to “X” instead:
var dotNotationString = "board."+ x +"." + y;
gamesColl.update({_id: realId},{
$set: {
dotNotationString : "X"
}
}, callback);
Dynamic dot-notation (workaround)
Then it hit me:
var setObject = {};
setObject["board."+ x +"."+ y] = player;
gamesColl.update({_id: realId},{
$set:setObject
}, function(err,doc){
console.log(err,doc);
});
PS: I’m not sure if I was really dumb and tired, but I found this to be the only practical solution to my (drinking) problem.