1 回答
TA贡献1911条经验 获得超7个赞
你可以试试,
$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" } } }
])
添加回答
举报
