Using positional operator for multiple levels of subdocuments

650 Views Asked by At

I am using sub-documents in mongodb.

With one level of sub-documents, I can update documents with

Parent.findOneAndUpdate({ _id: parentId, 'children._id': childId }, {
  $set: {
    'children.$.name': name
  }
}, (err, doc) => {
  ...
});

but I have problems doing the same for another level of sub-documents, i.e.

Parent.findOneAndUpdate({ _id: parentId, 'children._id': childId, 'children.grandchildren._id': grandchildId }, {
  $set: {
    'children.$.grandchildren.$.name': name
  }
}, (err, doc) => {
  ...
});

Is the positional operator ($) limited to only 1 level of subdocuments?

1

There are 1 best solutions below

3
Ravindu Nirmal Fernando On

Positional Operator ($) only supports one level and also the first matching element. As a workaround what you can do is this,

$set: { 'children.$.grandchildren.0.name': name }

I think this issue is more clearly explained here