Py学习  »  MongoDB

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

Gabor Szekely • 6 年前 • 2025 次点击  

因此,我在mongodb文档中有一个嵌套的对象数组,并且仅当某个字段(在本例中是eventid)是唯一的时,我想向数组中添加一个新对象。我的问题与 this post ,只有我似乎无法在我的情况下得到解决方案。

这是文件( 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' ,我相信在这种情况下它们在功能上是等价的)添加新对象。

有人能给我指个正确的方向吗?

干杯, 加布

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43483
文章 [ 2 ]  |  最新文章 6 年前
mickl
Reply   •   1 楼
mickl    7 年前

你需要包括你的 eventId 签入查询的条件部分。因为你在用 findByIdAndUpdate 只能通过匹配的单个值 _id 作为条件。所以你必须使用 findOneAndUpdate 要指定自定义筛选条件,请尝试:

UserModel.findOneAndUpdate(
    { _id: userId, "portal.events.eventId": { $ne: req.body.eventId } },
    { $addToSet: { "portal.events": req.body } },
    { new: true }
);
Akrion
Reply   •   2 楼
Akrion    7 年前

如果你调查一下 documentation 在方法中,您将看到传递的参数的顺序不正确。

findByIdAndUpdate(id, update, options, callback)

我会用 update 取而代之的是 id portal.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 }
);