You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用MongoDB的$pull操作符移除对象数组中子数组元素

如何从MongoDB嵌套数组中移除特定元素

数据库结构

{
  "userId": "sdsdad-dsdsds",
  "userName": "user1",
  "videos": [
    {
      "name": "video_541d",
      "likes": ["user1,", "user1"]
    },
    {
      "name": "video_3212",
      "likes": ["user1,", "user1", "user3"]
    }
  ]
}

需求

从指定userName的用户文档里,找到名称为videoName的视频对象,移除其likes数组中所有匹配userId的元素。

你的代码分析

你当前使用的代码:

const result = await User.updateOne(
  { userName, 'videos.name': videoName, 'videos.likes': userId },
  { $pull: { 'videos.$.likes': userId } }
);

这里有几个需要注意的点:

  • 'videos.likes': userId属于冗余条件——就算数组里没有该用户ID,$pull也不会报错,只是不会修改数据,去掉这个条件不影响功能,还能避免漏处理原本没有该用户点赞的视频(业务场景中可能不需要,但逻辑上更完整)。
  • 观察数据库里的likes数组,部分元素是"user1,"(带逗号),如果你的userId是"user1"(不带逗号),$pull会匹配不到这些带逗号的元素,导致无法移除。这大概率是数据录入错误,优先建议修正数据,也可以在代码中兼容这种情况。

修正后的代码方案

方案1:修正数据后使用(推荐)

先把likes数组里带逗号的元素改成纯用户ID(比如将"user1,"改为"user1"),然后用简化后的代码:

const result = await User.updateOne(
  { userName, 'videos.name': videoName },
  { $pull: { 'videos.$.likes': userId } }
);

$操作符会自动定位到第一个匹配'videos.name': videoName的视频对象,$pull会移除该视频likes数组中所有等于userId的元素。

方案2:兼容带逗号的元素

如果暂时无法修正数据,可以用正则匹配同时处理带逗号和不带逗号的情况:

// 注意:如果userId包含正则特殊字符(如.、*等),需要先转义
const escapedUserId = userId.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
const result = await User.updateOne(
  { userName, 'videos.name': videoName },
  { $pull: { 'videos.$.likes': { $regex: `^${escapedUserId},?$` } } }
);

这个正则会匹配以目标userId开头、末尾可选带逗号的元素,确保两种格式的元素都能被移除。

方案3:用arrayFilters更灵活定位

如果需要精确匹配多个视频(比如存在同名视频的极端情况),可以使用arrayFilters:

const result = await User.updateOne(
  { userName },
  { $pull: { 'videos.$[video].likes': userId } },
  { arrayFilters: [{ 'video.name': videoName }] }
);

这种方式会匹配所有符合arrayFilters条件的视频对象,批量移除它们likes数组中的目标用户ID。

验证结果

执行更新后,可通过findOne查询用户文档,确认目标视频的likes数组已正确移除指定用户ID:

const updatedUser = await User.findOne({ userName });
console.log(updatedUser.videos.find(v => v.name === videoName).likes);

内容的提问来源于stack exchange,提问作者Alpha Andrianarivo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 16:25:15