Você deve conseguir isso usando
$unwind
e $group
em seu pipeline de agregação. Isso primeiro nivela cada atributo em um único documento e nesses você pode agrupar pelo valor do atributo. Finalmente, você pode usar
$project
para obter o nome desejado para attributeValue
:db.collection.aggregate([
{
$unwind: "$attributeSet"
},
{
$group: {
_id: "$attributeSet.value",
data: {
"$addToSet": {
productId: "$productId"
}
}
}
},
{
"$project": {
_id: 0,
data: 1,
attributeValue: "$_id"
}
}
])
Veja este exemplo simplificado no mongoplayground:https://mongoplayground.net/p/VASadZnDedc