Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

DivergentArrayError in mongoose while updating array of referenced docs

I have a schema defined in mongoose as follow:

var VolunteerSchema = new Schema ({
......
other fields
.....
preferLocations:[{
        type: Schema.ObjectId,
        ref: 'Location'
    }]
.....
});

I am using volunteer.save() method to update the model.

While updating to volunteer model i get the error as follow:

{ [DivergentArrayError: For your own good, using `document.save()` to update an
array which was selected using an $elemMatch projection OR populated using skip,
 limit, query conditions, or exclusion of the _id field when the operation resul
ts in a $pop or $set of the entire array is not supported. The following path(s)
 would have been modified unsafely:
  preferLocations
Use Model.update() to update these arrays instead.]
  message: 'For your own good, using `document.save()` to update an array which
was selected using an $elemMatch projection OR populated using skip, limit, quer
y conditions, or exclusion of the _id field when the operation results in a $pop
 or $set of the entire array is not supported. The following path(s) would have
been modified unsafely:\n  preferLocations\nUse Model.update() to update these a
rrays instead.',
  name: 'DivergentArrayError' }

While updating the location I collect the _ids field in array and asigned to preferLocations as given below:

volunteer.preferLocations = locationIdsArray;

I don't get the error when I remove this line.What am I doing wrong?

like image 653
bring2dip Avatar asked Oct 19 '22 17:10

bring2dip


1 Answers

When using $elemMatch in a projection, do not use document.save(). Instead, manually update your document using Model.update(). In your case you should try

 volunteer.findOneAndUpdate(
  {
    _id: ObjectId("567452bae5b25d6e6c1a0f7e"),
    localization: { '$elemMatch': { language: 'de' } }
  },
  {
    $set: { 'localization.$.name' : "Neuer Name" }
  }).exec(//...
});

click here more details

like image 117
vineet Avatar answered Oct 30 '22 19:10

vineet