【问题标题】:Remove Object from Array in MongoDB given ID从给定 ID 的 MongoDB 数组中删除对象
【发布时间】:2022-01-26 19:56:35
【问题描述】:

我正在制作一个适用于播放列表的应用程序。我将 MongoDB 与 mongoose 一起使用,并通过数组将视频存储在每个播放列表中,如下所示:

{
  _id: ObjectId("61ca1d0ddb66b3c5ff93df9c")
  name: "Playlist A"
  videos: [
    { 
      title: "Video 1",
      url: "www.YouTube.com/video1", 
      startTime: "20",
      endTime: "40", 
      _id: ObjectId("61ca1d1ddb66b3c5ff93e0ba")
    },
    ...
  ]
}

我希望能够根据视频的_id 从播放列表中删除视频。我曾尝试在网上寻找解决方案,但我找到的解决方案不起作用。这就是我正在尝试的:

Playlist.updateOne(
    { _id: req.params.playlistId },
    { $pull: { videos: { _id: req.params.vidId } } }
  )

当我运行上面的代码并记录结果时,我得到以下信息(不确定这是否相关):

{
  acknowledged: true,
  modifiedCount: 1,
  upsertedId: null,
  upsertedCount: 0,
  matchedCount: 1
}

如果您需要更多信息,请告诉我这是我第一次发布问题:)

【问题讨论】:

  • 一个不错的提示:分别存储视频和播放列表。并在播放列表文档中,存储视频的 id
  • 你的查询是正确的,验证req.params.vidId变量对应ObjectId("61ca1d1ddb66b3c5ff93e0ba")类型ObjectId的值
  • @hhharsha36 是的!这就是问题所在,只需要用ObjectId() 包裹req.params.vidId。我以为猫鼬会自动执行此操作,但我想我错了。非常感谢!
  • @DarthApprentice 这是一个有趣的想法,我已经看到其他人这样做了。为什么存储视频 ID 更可取?这不会让访问每个视频变得更加复杂,因为我必须通过它们的 id 搜索每个视频,而不仅仅是在数组中已有视频?

标签: javascript arrays database mongodb mongoose


【解决方案1】:

这是一个 TypeError req.params.vidId 返回一个字符串,mongoose 正在寻找类型 ObjectId。解决方案是将字符串文字 (req.params.vidId) 转换为 ObjectId,如下所示:

Playlist.updateOne(
    { _id: req.params.playlistId },
    { $pull: { videos: { _id: mongoose.Types.ObjectId(req.params.vidId) } } }
  )

【讨论】:

    猜你喜欢
    • 2019-01-10
    • 2013-03-16
    • 2015-08-29
    • 2023-02-15
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    相关资源
    最近更新 更多