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

如何在MongoDB中找到单个集合中文档之间集合的集合交集?,mongodb,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]} } 如何找到上述集合文档中集合元素与\u id的1和3的交集。使用获得所需结果。聚合会产生神奇的效果,它是 以下聚合管

以下名为“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]}
}
如何找到上述集合文档中集合元素与
\u id
的1和3的交集。

使用获得所需结果。聚合会产生神奇的效果,它是

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

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
}

更新 对于要相交的三个或更多文档,需要使用操作符来展平数组。这将允许您与任意数量的数组相交,因此,这也将适用于多个数组,而不仅仅是与文档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"] }
                }
            }
        }
    }
])

如果我们想在一个集合中对三个或四个文档执行交集,您能否解释在管道的分组阶段发生了什么,以及如何继续?只有在正好有两个文档要交集的情况下,这才有效。如果有三个或更多,它将无法工作(因为您不能再使用$first和$last分别投影阵列)。祝贺您的响应!但我有以下问题:因为我想与所有文档相交,所以BufBuilder尝试将()增长到67108870字节,超过64MB限制。因为我的集合非常高:每个集合可能包含大约600K个7字节的元素。您是否有解决方案或解决方法可供提出?提前谢谢你!