无法使用 Mongoose 删除数组中的对象

Posted

技术标签:

【中文标题】无法使用 Mongoose 删除数组中的对象【英文标题】:Can't remove object in array using Mongoose 【发布时间】:2021-10-07 23:27:00 【问题描述】:

此处已对此进行了广泛介绍,但似乎没有一个解决方案对我有用。我正在尝试使用该对象的 id 从数组中删除一个对象。目前,我的架构是:

const scheduleSchema = new Schema(
//unrelated
_id: ObjectId
          shifts: [
            
              _id: Types.ObjectId,
              name: String,
              shift_start: Date,
              shift_end: Date,
            ,
          ],
        );

我已经尝试了几乎所有类似的变体:

.findOneAndUpdate(
     _id: req.params.id ,
    
      $pull: 
        shifts:  _id: new Types.ObjectId(req.params.id) ,
      ,
    
  );

数据库:

Database Format

在这些变体中,我得到的通常响应是空数组或 null。

我稍微找到了解决这个问题的方法,并通过利用 Schema 的主 _id 完成删除(而不是嵌套的:

.findOneAndUpdate(
     _id: <main _id> ,
     $pull:  shifts:  _id: new Types.ObjectId(<nested _id>)   ,
     new: true 
  );

但我希望通过使用嵌套的 _id 找到一种方法。有什么建议吗?

【问题讨论】:

您使用相同的值 (req.params.id) 搜索 _idshifts._id。这是正确的还是它们是不同的_id's?也许您正在寻找: 'shifts._id': req.params.id 在您的查询中, 刚刚更新。往上看。我以前使用相同的值,但能够通过使用条目的最高嵌套 _id 来完成删除。不过,我仍然想知道是否有更好的方法来实现这一点。 啊,是的。我明白你的意思了。这似乎奏效了。谢谢! .findOneAndUpdate( 'shifts._id': new Types.ObjectId(req.params.id) , $pull: shifts: _id: new Types.ObjectId(req.params.id) , , , 新:真 ); 如果你愿意,我可以添加一个答案以更好地解释我的评论。 是的,拜托!那太好了。 【参考方案1】:

您目前遇到的问题是您使用的是相同的_id

使用 mongo,update 方法允许三个对象:查询、更新和选项。

query object 是将要更新的集合中的对象。 update 是对对象执行的操作(添加、更改值...)。 options 添加不同的选项。

那么,假设你有这个收藏:

[
  
    "_id": 1,
    "shifts": [
      
        "_id": 2
      ,
      
        "_id": 3
      
    ]
  
]

如果您尝试查找_id 为2 的文档,显然响应将为空(example)。

然后,如果没有找到任何文档,则不会更新任何文档。

如果我们使用 shifts._id:2 查找文档会发生什么? 这告诉 mongo“搜索一个文档,其中 shifts 字段有一个 _id 等于 2 的对象”。此查询可以正常工作(example),但要小心,这会返回整个文档,而不仅仅是匹配 _id 的数组。

这个返回:

[
  
    "_id": 1,
    "shifts": [
      
        "_id": 2
      
    ]
  
]

使用此查询 mongo 会返回整个文档,其中存在一个名为 shifts 的字段,其中包含一个带有值为 2 的 _id 的对象。这也包括整个数组。

所以,有了 tat,您就知道为什么 find 对象有效。现在将其添加到 update 查询中,您可以创建查询:

这个删除所有等于2的shifts._id

db.collection.update(
  "shifts._id": 2
,

  $pull: 
    shifts: 
      _id: 2
    
  
)

Example

如果父 _id 等于 1,则删除此 shifts._id

db.collection.update(
  "_id": 1
,

  $pull: 
    shifts: 
      _id: 2
    
  
)

Example

【讨论】:

以上是关于无法使用 Mongoose 删除数组中的对象的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 mongoose 使用 API 删除数组中的某些内容?

无法从 Mongoose 访问 populate()'d 对象的属性?

从 Mongoose/MongoDB 中的数组中删除对象

Mongoose 无法将新对象推送到父数组

无法从 Handlebars 中的数组访问对象属性

将对象数组添加到突变 react-graphql-apollo-mongoose 时,“无法读取未定义的属性 'get'”