如何在MongoDB的单个集合中的文档之间找到集合的集合?

时间:2015-06-04 14:25:07

标签: mongodb

以下名为" coll"维持在mongodb。

{
    {"_id":1, "set":[1,2,3,4,5]},
    {"_id":2, "set":[0,2,6,4,5]},
    {"_id":3, "set":[1,2,5,10,22]}
}

如何使用_id&1; 3来查找上述集合文档中的集合元素的交集。

1 个答案:

答案 0 :(得分:4)

使用 aggregation framework 获取所需结果。能够发挥魔力的聚合 set operator $setIntersection

以下聚合管道实现了您的目标:

db.test.aggregate([
    {
        "$match": {
            "_id": { "$in": [1, 3] }
        }
    },
    {
        "$group": {
            "_id": 0,
            "set1": { "$first": "$set" },
            "set2": { "$last": "$set" }
        }
    },
    {
        "$project": { 
            "set1": 1, 
            "set2": 1, 
            "commonToBoth": { "$setIntersection": [ "$set1", "$set2" ] }, 
            "_id": 0 
        }
    }
])

<强>输出

/* 0 */
{
    "result" : [ 
        {
            "set1" : [1,2,3,4,5],
            "set2" : [1,2,5,10,22],
            "commonToBoth" : [1,2,5]
        }
    ],
    "ok" : 1
}

更新

要交叉三个或更多文档,您需要 $reduce 运算符来展平数组。这将允许您与任意数量的数组相交,因此,不仅仅是从文档1和3中执行两个数组的交集,这也适用于多个数组。

考虑运行以下聚合操作:

db.test.aggregate([
    { "$match": { "_id": { "$in": [1, 3] } } },
    {
        "$group": {
            "_id": 0,
            "sets": { "$push": "$set" },
            "initialSet": { "$first": "$set" }
        }
    },
    {
        "$project": {
            "commonSets": {
                "$reduce": {
                    "input": "$sets",
                    "initialValue": "$initialSet",
                    "in": { "$setIntersection": ["$$value", "$$this"] }
                }
            }
        }
    }
])