{_id:111,
keywords:['cs','ee','se']
},
{_id:112,
keywords:['cs','se','dd']
},
如何获得关键字项的关系? 那样:
{item1:'cs',item2:'ee',count:1},
{item1:'cs',item2:'se',count:2},
{item1:'ee',item2:'se',count:1},
{item1:'cs',item2:'dd',count:1},
{item1:'se',item2:'dd',count:1},
答案 0 :(得分:0)
如果我从给定的示例中正确理解了您的关系 - 此查询应该是您问题的解决方案:
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
}