【问题标题】:MongoDB/Mongoose - Adding an object to an array of objects only if a certain field is uniqueMongoDB/Mongoose - 仅当某个字段是唯一的时才将对象添加到对象数组中
【发布时间】: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 个参数

标签: javascript node.js mongodb mongoose subdocument


【解决方案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 }
    );
    

    【讨论】:

      猜你喜欢
      • 2017-08-18
      • 2020-11-25
      • 2016-02-06
      • 1970-01-01
      • 2013-06-25
      • 2021-05-30
      • 2020-04-28
      • 1970-01-01
      • 2021-06-04
      相关资源
      最近更新 更多