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

如何遍历MongoDB集合中的AlbumID键并提取所有曲目

获取所有用户所有专辑的曲目方法

针对你的数据结构,这里提供两种实用的实现方式,适合MongoDB新手操作:

方法一:Mongo Shell 脚本(简单易上手)

直接在Mongo Shell中运行以下脚本,即可收集所有用户所有专辑的曲目:

// 初始化空数组存储所有曲目
let allTracks = [];

// 获取当前数据库下的所有用户集合(集合名即用户profile ID)
const userCollections = db.getCollectionNames();

// 遍历每个用户集合
userCollections.forEach(collectionName => {
  // 取出集合中的唯一文档(每个集合对应一个用户,仅存一个文档)
  const userDoc = db.getCollection(collectionName).findOne();
  
  if (userDoc) {
    // 遍历文档中除_id外的所有字段(即所有AlbumID)
    Object.keys(userDoc).forEach(key => {
      if (key !== '_id') {
        // 将当前专辑的曲目合并到总列表
        allTracks = allTracks.concat(userDoc[key]);
      }
    });
  }
});

// 打印所有曲目
print("所有曲目:");
printjson(allTracks);

脚本说明

  1. db.getCollectionNames() 获取当前数据库的所有集合(即所有用户的profile ID集合)
  2. 遍历每个集合,用findOne()取出用户的唯一文档
  3. 跳过_id字段,将每个AlbumID对应的曲目数组合并到总数组中
  4. 最后打印所有曲目

方法二:聚合框架(高效批量处理)

如果数据量较大,推荐用聚合框架批量处理,还可将结果保存到新集合方便后续查询:

// 执行聚合操作,将所有曲目输出到all_tracks集合
db.aggregate([
  // 列出当前数据库的所有集合
  { $listCollections: {} },
  // 对每个集合查询并处理曲目
  {
    $lookup: {
      from: "$$name",
      pipeline: [
        // 将文档转为键值对数组,排除_id
        { $project: { data: { $objectToArray: "$$ROOT" }, _id: 0 } },
        // 展开键值对数组
        { $unwind: "$data" },
        // 过滤掉_id对应的键值对
        { $match: { "data.k": { $ne: "_id" } } },
        // 展开每个专辑的曲目数组
        { $unwind: "$data.v" },
        // 提取曲目字段
        { $project: { track: "$data.v" } }
      ],
      as: "tracks"
    }
  },
  // 展开所有曲目结果
  { $unwind: "$tracks" },
  // 仅保留曲目字段
  { $project: { _id: 0, track: "$tracks.track" } },
  // 可选:去重(如果存在重复曲目)
  // { $group: { _id: "$track", track: { $first: "$track" } } },
  // { $project: { _id: 0, track: 1 } },
  // 将结果保存到all_tracks集合
  { $out: "all_tracks" }
])

// 查询保存的结果
db.all_tracks.find()

聚合说明

  1. $listCollections 获取所有用户集合
  2. $lookup 关联每个集合,内部通过$objectToArray将动态的AlbumID字段转为可处理的键值对
  3. 多层$unwind展开专辑和曲目,提取出单个曲目
  4. 可选$group去重,最后用$out将结果保存到新集合

额外提示

  • 如果只需要单个用户的所有曲目,直接指定集合名即可,比如 db.userProfileID.findOne(),再按脚本中的方式处理字段
  • 若曲目存在重复,可在两种方法中加入去重逻辑(比如脚本中用[...new Set(allTracks)],聚合中用$group)

内容的提问来源于stack exchange,提问作者Lara-Codes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:02:22