A agregação é bastante longa, mas funciona. A ideia é que você precisa construir pares
(x,y)
com base em suas client_interactions
variedade. Isso pode ser feito usando $reduce
e $map
. Então você precisa executar $unwind
e alguns $group
etapas para "enrolar" seus dados agregados. Você também precisa de $arrayToObject
para construir suas chaves dinamicamente. db.collection.aggregate([
{
$addFields: {
"client_interactions": {
$filter: { input: "$client_interactions", cond: { $eq: [ "$$this.productType", "A" ] } }
}
}
},
{
$project: {
a: {
$reduce: {
input: "$client_interactions",
initialValue: [],
in: {
$concatArrays: [
"$$value",
{ $map: { input: "$client_interactions", as: "c", in: { x: "$$this.productId", y: "$$c.productId" } } }
]
}
}
}
}
},
{
$unwind: "$a"
},
{
$match: {
$expr: {
$ne: [ "$a.x", "$a.y" ]
}
}
},
{
$sort: {
"a.x": 1,
"a.y": 1
}
},
{
$group: {
_id: "$a",
count: { $sum: 1 }
}
},
{
$group: {
_id: "$_id.x",
arr: { $push: { k: "$_id.y", v: "$count" } }
}
},
{
$group: {
_id: null,
"co-ocurrences-count": { $push: { k: "$_id", v: { $arrayToObject: "$arr" } } }
}
},
{
$project: {
_id: 0,
"co-ocurrences-count": { $arrayToObject: "$co-ocurrences-count" }
}
}
])
Mongo Playground