如何遍历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);
脚本说明
db.getCollectionNames()获取当前数据库的所有集合(即所有用户的profile ID集合)- 遍历每个集合,用
findOne()取出用户的唯一文档 - 跳过
_id字段,将每个AlbumID对应的曲目数组合并到总数组中 - 最后打印所有曲目
方法二:聚合框架(高效批量处理)
如果数据量较大,推荐用聚合框架批量处理,还可将结果保存到新集合方便后续查询:
// 执行聚合操作,将所有曲目输出到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()
聚合说明
$listCollections获取所有用户集合$lookup关联每个集合,内部通过$objectToArray将动态的AlbumID字段转为可处理的键值对- 多层
$unwind展开专辑和曲目,提取出单个曲目 - 可选
$group去重,最后用$out将结果保存到新集合
额外提示
- 如果只需要单个用户的所有曲目,直接指定集合名即可,比如
db.userProfileID.findOne(),再按脚本中的方式处理字段 - 若曲目存在重复,可在两种方法中加入去重逻辑(比如脚本中用
[...new Set(allTracks)],聚合中用$group)
内容的提问来源于stack exchange,提问作者Lara-Codes
相关产品推荐
相关产品推荐

