Using positional operator for multiple levels of s

2019-09-10 12:11发布

问题:

This question already has an answer here:

  • Multiple use of the positional `$` operator to update nested arrays 2 answers

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:

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