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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:30:46