MongoDB/Mongoose - 仅当特定字段唯一时才将对象添加到对象数组

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

所以我的 MongoDB 文档中有一个嵌套的对象数组,我想仅当某个字段(在本例中为 eventId)唯一时才向该数组添加一个新对象。我的问题与 非常相似,只是我似乎无法使该解决方案适用于我的情况。

文档 (UserModel) 如下所示:

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

这是我的(迄今为止未成功)猫鼬操作:

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

基本上我尝试使用'$ne'来检查该字段是否是唯一的,然后'$addToSet'(或'$push',我相信在这种情况下它们在功能上是等价的)添加新对象。

谁能给我指出正确的方向?

干杯, 加布

您需要在查询中包含 eventId 签入条件部分。因为你是用findByIdAndUpdate you can only pass single value matched against _id as a condition. Therefore you have to use findOneAndUpdate来指定自定义过滤条件,试试:

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

如果您查看方法中的 documentation,您会发现传递的参数顺序不正确。

findByIdAndUpdate(id, update, options, callback)

我会改用 update,让你的 idportal.events.eventId": { $ne: req.body.eventId } 部分成为初始过滤器,然后是 $addToSet: { "portal.events": req.body }

这些行中的内容:

UserModel.update(
  { 
     "_id": mongoose.Types.ObjectId(userId), 
     "portal.events.eventId": { $ne: req.body.eventId }
  },
  { $addToSet: { "portal.events": req.body } },
  { new: true }
);