Aggregation khá dài nhưng nó hoạt động. Ý tưởng là bạn cần tạo các cặp (x,y)
dựa trên client_interactions
của bạn mảng. Có thể thực hiện việc này bằng cách sử dụng $ giảm
và $ map
. Sau đó, bạn cần chạy $ unwind
và một số $ group
các giai đoạn để "thu gọn" dữ liệu tổng hợp của bạn. Bạn cũng cần có $ arrayToObject
để xây dựng các khóa của bạn một cách linh hoạt.
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" }
}
}
])