首页 > 解决方案 > 无法使用 Mongoose 删除数组中的对象

问题描述

此处已对此进行了广泛介绍,但是似乎没有一个解决方案对我有用。我正在尝试使用该对象的 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) },
      },
    }
  );

数据库:

数据库格式

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

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

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

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

标签: mongodbmongoosenosql

解决方案


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

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

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

然后,假设你有这个集合:

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

如果您尝试查找为_id2 的文档,则显然响应将为空(示例)

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

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

返回:

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

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

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

这一项删除所有shifts._id等于 2 的项。

db.collection.update({
  "shifts._id": 2
},
{
  $pull: {
    shifts: {
      _id: 2
    }
  }
})

例子

shifts._id或者如果 parent_id等于 1 则删除这个

db.collection.update({
  "_id": 1
},
{
  $pull: {
    shifts: {
      _id: 2
    }
  }
})

例子


推荐阅读