Search code examples
javascriptnode.jsmongodbmongoosesubdocument

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


Solution

  • 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 }
    );