MongoDB/Mongoose - 仅当某个字段是唯一的时才将对象添加到对象数组中

Posted

技术标签:

【中文标题】MongoDB/Mongoose - 仅当某个字段是唯一的时才将对象添加到对象数组中【英文标题】:MongoDB/Mongoose - Adding an object to an array of objects only if a certain field is unique 【发布时间】:2019-05-10 06:19:49 【问题描述】:

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

这是文档 (UserModel) 的样子:


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

这是我的(到目前为止不成功的)Mongoose 操作:

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

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

谁能指出我正确的方向?

干杯, 加布

【问题讨论】:

为什么不使用 findOneAndUpdate 并在查询中包含 $ne: req.body.eventId?另外,findByIdAndUpdate 只接受 3 个参数(如果是 4,最后一个将是回调),而您正在发送 4 个参数 【参考方案1】:

如果您查看方法中的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 
);

【讨论】:

【参考方案2】:

您需要在查询的条件部分中包含您的eventId 检查。因为您使用findByIdAndUpdate,所以您只能传递与_id 匹配的单个值作为条件。所以你必须使用findOneAndUpdate来指定自定义过滤条件,试试:

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

【讨论】:

以上是关于MongoDB/Mongoose - 仅当某个字段是唯一的时才将对象添加到对象数组中的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB (Mongoose) 如何使用 $elemMatch 返回所有文档字段

MongoDB/Mongoose:在填充字段中排序

日期字段上的 MongoDB/Mongoose 唯一约束

mongoDb/Mongoose:使 emailId 唯一字段[重复]

如何使用 MongoDB/Mongoose 中的先前值更新字段 [重复]

使用嵌套字段在MongoDB / Mongoose中创建多对多关系?