Si j'ai bien compris votre relation à partir de l'exemple donné - cette requête devrait être une solution à votre problème :
db.collection.aggregate([{
$unwind : "$keywords"
}, {
$lookup : {
from : "collection",
localField : "_id",
foreignField : "_id",
as : "items"
}
}, {
$unwind : "$items"
}, {
$unwind : "$items.keywords"
}, {
$redact : {
$cond : {
if : {
$cmp : ["$keywords", "$items.keywords"]
},
then : "$$DESCEND",
else : "$$PRUNE"
}
}
}, {
$group : {
_id : {
k1 : "$keywords",
k2 : "$items.keywords",
},
items : {
$sum : 0.5
}
}
}, {
$sort : {
"_id" : 1
}
}, {
$project : {
_id : 1,
items : 1,
a : {
$cond : {
if : {
$eq : [{
$cmp : ["$_id.k1", "$_id.k2"]
}, 1]
},
then : "$_id.k2",
else : "$_id.k1"
}
},
b : {
$cond : {
if : {
$eq : [{
$cmp : ["$_id.k1", "$_id.k2"]
}, -1]
},
then : "$_id.k2",
else : "$_id.k1"
}
},
}
}, {
$group : {
_id : {
k1 : "$a",
k2 : "$b",
},
items : {
$sum : "$items"
}
}
}, {
$project : {
_id : 0,
item1 : "$_id.k1",
item2 : "$_id.k2",
count : "$items"
}
}
])
{
"item1" : "cs",
"item2" : "dd",
"count" : 1.0
}
{
"item1" : "cs",
"item2" : "ee",
"count" : 1.0
}
{
"item1" : "cs",
"item2" : "se",
"count" : 2.0
}
{
"item1" : "dd",
"item2" : "se",
"count" : 1.0
}
{
"item1" : "ee",
"item2" : "se",
"count" : 1.0
}