Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MongoDB/Mongoose - Adding an object to an array of objects only if a certain field is unique

So I have a nested array of objects in my MongoDB document and I would like to add a new object to the array only if a certain field (in this case, eventId) is unique. My question is very similar to this post, only I cannot seem to get that solution to work in my case.

Here is what the documents (UserModel) look like:

{
  "portal" : {
    "events" : [ 
      {
        "important" : false,
        "completed" : false,
        "_id" : ObjectId("5c0c2a93bb49c91ef8de0b21"),
        "eventId" : "5bec4a7361853025400ee9e9",
        "user_notes" : "My event note"
      },
      ...and so on
    ]
  }
}

And here is my (so far unsuccessful) Mongoose operation:

UserModel.findByIdAndUpdate(
  userId,
  { "portal.events.eventId": { $ne: req.body.eventId } },
  { $addToSet: { "portal.events": req.body } },
  { new: true }
);

Basically I am trying to use '$ne' to check if the field is unique, and then '$addToSet' (or '$push', I believe they are functionally equivalent in this case) to add the new object.

Could anyone point me in the right direction?

Cheers, Gabe

like image 363
Gabor Szekely Avatar asked Sep 19 '25 21:09

Gabor Szekely


1 Answers

If you look into the documentation on your method you will see that the parameters passed are not in the proper order.

findByIdAndUpdate(id, update, options, callback)

I would use update instead and have your id and portal.events.eventId": { $ne: req.body.eventId } part of the initial filter followed by $addToSet: { "portal.events": req.body }

Something among these lines:

UserModel.update(
  { 
     "_id": mongoose.Types.ObjectId(userId), 
     "portal.events.eventId": { $ne: req.body.eventId }
  },
  { $addToSet: { "portal.events": req.body } },
  { new: true }
);
like image 81
Akrion Avatar answered Sep 21 '25 12:09

Akrion