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

Can't remove object in array using Mongoose

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

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

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

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

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

使用 mongo、update 方法允许三种 object:查询、更新和选项。

  • query object 是 object 到 collection 将被更新。
  • update 是对 object 执行的操作(添加、更改值...)。
  • options 要添加的不同选项。

然后,假设你有这个 collection:

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

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

然后,如果找到 none 个文档,将更新 none 个文档。

如果我们使用 shifts._id:2 查找文档会怎样?
这告诉 mongo“搜索 shifts 字段的 object 且 _id 等于 2 的文档”。这个查询工作正常 (example) 但要小心,这个 return 是整个文档,而不仅仅是匹配 _id.

的数组

这个不是return:

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

使用此查询 mongo returns 整个文档存在一个名为 shifts 的字段,其中包含一个 object 和一个 _id 值为 2 .这也包括整个数组。

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

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

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

Example

或者如果 parent _id 等于 1

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

Example