Smart猫小萌
你可以试试,$groupby null 并创建根对象数组并获取根中对象的总数$unwind解构root我们在上面阶段创建的数组$unwind解构root.attributes数组$group通过root.attributes.attrId和获取分组文档和值的总数,以使用对象中的值数组形式root.attributes.values获取 k(key)attrId和 v(value)并获取第一个字段values$maptotalCount$match使用$expr检查公共文档计数和总根对象文档的表达式都相等,然后返回匹配的文档$replaceRoot$arraToObject从ofvalues数组转换后替换 and 对象db.collection.aggregate([ { $group: { _id: null, root: { $push: "$$ROOT" }, totalCount: { $sum: 1 } } }, { $unwind: "$root" }, { $unwind: "$root.attributes" }, { $group: { _id: { attrId: "$root.attributes.attrId", values: "$root.attributes.values" }, values: { $addToSet: { k: "$root.attributes.attrId", v: { $map: { input: "$root.attributes.values", in: "$$this.name" } } } }, count: { $sum: 1 }, totalCount: { $first: "$totalCount" } } }, { $match: { $expr: { $eq: ["$count", "$totalCount"] } } }, { $replaceRoot: { newRoot: { $arrayToObject: "$values" } } }])