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

MongoDB聚合$group按对象分组:基于引用还是值?

MongoDB $group 按对象分组:基于值而非引用

MongoDB 的 $group 操作在使用对象作为 _id 分组依据时,完全基于对象的内容值进行分组,而非对象引用。

底层逻辑说明

分组时,MongoDB 会对作为分组键的对象进行深度值比较:递归检查两个对象的所有键名、值类型以及具体值是否完全一致。只要两个对象的结构和内容完全匹配,即使它们是原始文档中独立的对象实例(内存引用不同),也会被归为同一分组。

你的示例验证

从你提供的文档和聚合结果可以直接验证这一点:

  • 前两个文档的 title 对象虽然是独立实例,但 title: "b" 和 order: 1 的内容完全一致,因此被分到同一组,对应结果中包含 name: "a" 和 name: "b" 的条目。
  • 第三个文档的 title 对象内容(title: "c"、order: 2)与前两个不同,因此单独成为一个分组。

补充细节

  • 这种值比较支持嵌套对象的多层级匹配,只要任意层级的键值对不匹配,就会被分为不同组。
  • 如果分组键是数组,同样会按数组的元素顺序、每个元素的值进行全量匹配。

你的示例文档:

[
  {
    name: "a",
    title: {
      title: "b",
      order: 1
    },
    group: "B"
  },
  {
    name: "b",
    title: {
      title: "b",
      order: 1
    },
    group: "Bs"
  },
  {
    name: "c",
    title: {
      title: "c",
      order: 2
    },
    group: "B"
  }
]

聚合查询:

db.collection.aggregate([
  {
    "$group": {
      "_id": "$title",
      "items": {
        "$addToSet": {
          "name": "$name",
          "group": "$group"
        }
      }
    }
  }
])

返回结果:

[
  {
    "_id": {
      "order": 1,
      "title": "b"
    },
    "items": [
      {
        "group": "B",
        "name": "a"
      },
      {
        "group": "Bs",
        "name": "b"
      }
    ]
  },
  {
    "_id": {
      "order": 2,
      "title": "c"
    },
    "items": [
      {
        "group": "B",
        "name": "c"
      }
    ]
  }
]

内容的提问来源于stack exchange,提问作者Elisa Muradan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 09:50:27