【问题标题】:Can't remove object in array using Mongoose无法使用 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) }, }, }, { 新:真 } );
  • 如果你愿意,我可以添加一个答案以更好地解释我的评论。
  • 是的,拜托!那太好了。

标签: mongodb mongoose nosql


【解决方案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

【讨论】:

    猜你喜欢
    • 2020-05-09
    • 2016-10-28
    • 2021-12-01
    • 2016-03-16
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 2012-11-25
    相关资源
    最近更新 更多