konrad
konrad

Reputation: 3706

updating elements in nested arrays

I think I know how to get to my object, I just can't figure out how to update it's values. I am getting this error:

{
    "name": "MongoError",
    "message": "cannot use the part (tasks of families.25.tasks.name) to traverse the element ({tasks: [ { name: \"Correct Name\", isSelected: false, completedBy: null, submittedBy: \"web-user\", completedOn: null, submittedOn: new Date(1505857352113), message: \"Please correct family name to follow HOK standard.\", assignedTo: \"konrad.sobon\", _id: ObjectId('59c18f8991d1929d43f22f8c') }, { name: \"Some other task\", isSelected: false, completedBy: null, submittedBy: \"web-user\", completedOn: null, submittedOn: new Date(1505917405948), message: \"Yet again, testing this.\", assignedTo: \"konrad.sobon\", _id: ObjectId('59c279fb8388cb58e7454bf6') } ]})",
    "driver": true,
    "index": 0,
    "code": 16837,
    "errmsg": "cannot use the part (tasks of families.25.tasks.name) to traverse the element ({tasks: [ { name: \"Correct Name\", isSelected: false, completedBy: null, submittedBy: \"web-user\", completedOn: null, submittedOn: new Date(1505857352113), message: \"Please correct family name to follow HOK standard.\", assignedTo: \"konrad.sobon\", _id: ObjectId('59c18f8991d1929d43f22f8c') }, { name: \"Some other task\", isSelected: false, completedBy: null, submittedBy: \"web-user\", completedOn: null, submittedOn: new Date(1505917405948), message: \"Yet again, testing this.\", assignedTo: \"konrad.sobon\", _id: ObjectId('59c279fb8388cb58e7454bf6') } ]})"
}

My collection looks like this:

enter image description here

My request handler looks like this:

module.exports.updateTask = function (req, res) {
    var id = req.params.id;
    var taskId = mongoose.Types.ObjectId(req.params.taskid);

    Families
        .update(
            { _id: id, 'families.tasks._id': taskId},
            { $set: {
                'families.$.tasks.name': req.body.name,
                'families.$.tasks.message': req.body.message,
                'families.$.tasks.assignedTo': req.body.assignedTo}}, function(err, result){
                if(err) {
                    res
                        .status(400)
                        .json(err);
                } else {
                    res
                        .status(202)
                        .json(result);
                }
            }
        )
};

Any help will be appreciated.

Upvotes: 0

Views: 44

Answers (1)

Steve Holgado
Steve Holgado

Reputation: 12071

Unfortunately the positional operator $ cannot be used for nested arrays:

The positional $ operator cannot be used for queries which traverse more than one array, such as queries that traverse arrays nested within other arrays, because the replacement for the $ placeholder is a single value.

https://docs.mongodb.com/manual/reference/operator/update/positional/

You might have to consider restructuring your documents.

Upvotes: 1

Related Questions