计算所有组合的对词

时间:2018-02-28 15:35:27

标签: mongodb count match

我在MongoDB中有类似的数据库:

{ "_id" : "piramidales", "LiciList" : [ "318081", "318157" ] }
{ "_id" : "pyramidalis", "LiciList" : [ "318081", "318157" ] }
{
        "_id" : "toneis",
        "LiciList" : [
                "318077",
                "318151",
                "318288",
                "318360",
                "318666"
        ]

我想计算所有组合的对词!

如何获取LiciList项目的关系?像这样:

{item1:'piramidales',item2:'pyramidalis',count:2},
{item1:'piramidales',item2:'toneis',count:0},
{item1:'pyramidalis',item2:'toneis',count:0}

1 个答案:

答案 0 :(得分:1)

您可以尝试以下聚合:

db.col.aggregate([
    {
        $group: {
            _id: null,
            item1: { $push: "$$ROOT" },
            item2: { $push: "$$ROOT" },
        }
    },
    { $unwind: "$item1" },
    { $unwind: "$item2" },
    { 
        $project: { 
            _id: 0,
            item1: "$item1._id", 
            item2: "$item2._id",
            count: { $size: { $setIntersection: [ "$item1.LiciList", "$item2.LiciList" ] } }
        } 
    },
    {
        $redact: {
            $cond: {
               if: { $and: [{ $gt: [ "$item2", "$item1" ] }, { $gt: [ "$count", 0 ] } ] },
               then: "$$KEEP",
               else: "$$PRUNE"
            }
       }
    }
],
{ allowDiskUse: true })

基本上你必须生成具有对(item1,item2)的文档,这就是为什么我们必须将所有内容分组到一个包含两个字段的文档中然后展开两次。要计算匹配元素,我们可以使用$setIntersection。然后我们必须使用$redact过滤掉重复项。简单地使用$ gt比较字符串将会消除(toneistoneis)或(toneispyramidalis)等对()pyramidalistoneis )。