एकत्रीकरण बहुत लंबा है लेकिन यह काम करता है। विचार यह है कि आपको जोड़े बनाने की जरूरत है (x,y)
आपके client_interactions
. के आधार पर सरणी। इसे $reduce
का इस्तेमाल करके किया जा सकता है और $map
. फिर आपको $unwind
चलाने की जरूरत है और कुछ $group
आपके एकत्रित डेटा को "विंड" करने के चरण। आपको $arrayToObject
की भी आवश्यकता है। अपनी चाबियाँ गतिशील रूप से बनाने के लिए।
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" }
}
}
])