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
相关产品推荐
相关产品推荐

