使用MongoDB Aggregate框架查询深度嵌套JSON数据遇阻求助
针对你的MongoDB聚合查询问题,我来给你几个实用的管道示例
先把你提供的原始数据整理成更易读的格式:
[ { "_id": ObjectId("5adf2294bc832359aa9bc710"), "kabupaten": "Badung", "jenis_wisata": [ { "jenis": "resto", "list": [ { "nama_resto": "Warung Nasi Ayam Bu Oki", "alamat": "Bukit Jimbaran" }, { "nama_resto": "Warung Pojok Segitiga Emas", "alamat": "Bukit Jimbaran" } ] }, { "jenis": "gunung", "list": [ { "nama_gunung": "gunung_1", "alamat": "alamat_1" }, { "nama_gunung": "gunu..." } ] } ] } ]
结合这个嵌套数组的结构,我整理了几个常见查询场景的聚合管道写法,你可以参考调整:
1. 扁平化嵌套数组,查看所有景点的单独条目
如果想把多层嵌套的数组展开成单条文档(方便后续分析或导出),可以用两次$unwind:
db.collection.aggregate([ // 先展开顶层的jenis_wisata数组 { $unwind: "$jenis_wisata" }, // 再展开每个景点类型下的list数组 { $unwind: "$jenis_wisata.list" }, // 精简输出字段,让结果更清晰 { $project: { _id: 0, kabupaten: 1, jenis_wisata: "$jenis_wisata.jenis", detail: "$jenis_wisata.list" } } ])
执行后会得到类似这样的单条文档:
{ "kabupaten": "Badung", "jenis_wisata": "resto", "detail": { "nama_resto": "Warung Nasi Ayam Bu Oki", "alamat": "Bukit Jimbaran" } }
2. 过滤出特定类型的景点(比如只提取餐厅)
如果只想获取jenis为resto的所有餐厅信息,可以结合$match和$unwind实现:
db.collection.aggregate([ { $unwind: "$jenis_wisata" }, // 精准匹配餐厅类型的条目 { $match: { "jenis_wisata.jenis": "resto" } }, { $unwind: "$jenis_wisata.list" }, // 重命名字段让输出更直观 { $project: { _id: 0, kabupaten: 1, jenis: "$jenis_wisata.jenis", nama_resto: "$jenis_wisata.list.nama_resto", alamat: "$jenis_wisata.list.alamat" } } ])
3. 统计每个地区的景点类型数量
如果想统计Badung地区每种景点类型下的条目总数,可以用$group配合$size:
db.collection.aggregate([ { $unwind: "$jenis_wisata" }, { $group: { _id: { kabupaten: "$kabupaten", jenis: "$jenis_wisata.jenis" }, // 统计每个类型下的景点数量 total_items: { $size: "$jenis_wisata.list" } } }, // 重新组织输出结构,去掉嵌套的_id { $project: { _id: 0, kabupaten: "$_id.kabupaten", jenis_wisata: "$_id.jenis", total_items: 1 } } ])
执行后会得到统计结果:
{ "kabupaten": "Badung", "jenis_wisata": "resto", "total_items": 2 } { "kabupaten": "Badung", "jenis_wisata": "gunung", "total_items": 2 }
如果你的具体需求和上面的场景不一样,比如要做更复杂的筛选、排序或者关联,随时补充说明,我再帮你调整管道~
内容的提问来源于stack exchange,提问作者surya_darmana
相关产品推荐
相关产品推荐

