1 回答
TA贡献1911条经验 获得超7个赞
你可以试试,
$group
by null 并创建根对象数组并获取根中对象的总数$unwind
解构root
我们在上面阶段创建的数组$unwind
解构root.attributes
数组$group
通过root.attributes.attrId
和获取分组文档和值的总数,以使用对象中的值数组形式root.attributes.values
获取 k(key)attrId
和 v(value)并获取第一个字段values
$map
totalCount
$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" } } }
])
添加回答
举报