L'agrégation est assez longue mais ça marche. L'idée est que vous devez construire des paires (x,y)
en fonction de vos client_interactions
déployer. Cela peut être fait en utilisant $reduce
et $map
. Ensuite, vous devez exécuter $unwind
et quelques $group
étapes pour "enrouler" vos données agrégées. Vous avez également besoin de $arrayToObject
pour construire vos clés dynamiquement.
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" }
}
}
])