社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  MongoDB

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

Gabor Szekely • 5 年前 • 1682 次点击  

因此,我在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
 
1682 次点击  
文章 [ 2 ]  |  最新文章 5 年前
mickl
Reply   •   1 楼
mickl    6 年前

你需要包括你的 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    6 年前

如果你调查一下 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 }
);