Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MongoDB在一次调用中的并集和交集_C#_Mongodb_Mongodb Query_Aggregation Framework_Mongodb .net Driver - Fatal编程技术网

C# MongoDB在一次调用中的并集和交集

C# MongoDB在一次调用中的并集和交集,c#,mongodb,mongodb-query,aggregation-framework,mongodb-.net-driver,C#,Mongodb,Mongodb Query,Aggregation Framework,Mongodb .net Driver,我希望能够执行并集和交集 我的文档结构: { "_id" : 1, "items" : [ 52711, 201610, 273342, 279449, 511250 ] }, { "_id" : 2, "items" : [ 246421, 390200 ] } 此集合包含上述形式的数千份文档。 我想对文档集执行并集,然

我希望能够执行并集和交集

我的文档结构:

{
    "_id" : 1,
    "items" : [ 
        52711, 
        201610, 
        273342, 
        279449, 
        511250
    ]
},
{
    "_id" : 2,
    "items" : [ 
        246421, 
        390200
    ]
}
此集合包含上述形式的数千份文档。 我想对文档集执行并集,然后对从并集返回的集合执行交集

例如:

Set 1 contains Id: [1,2,3,4,5]
Set 2 Contains Id: [3,4,5,6,7,8]
Set 3 Contains Id: [12,14,15,16,17]
它应该合并集合1、集合2和集合3中的所有列表项。然后对每个集合的结果执行交集

到目前为止,我得到的查询不支持列表的并集,如下所示:

db.getCollection('Test').aggregate([
    { "$match": { "_id": { "$in": [1, 2, 3] } } },
    {
        "$group": {
            "_id": 0,
            "data": { "$push": "$items" }
        }
    },
    {
        "$project": {
            "items": {
                "$reduce": {
                    "input": "$data",
                    "initialValue": [],
                    "in": { "$setUnion": ["$$value", "$$this"] }
                }
            }
        }
    }
]) 
我现在也在用c#做这一切:

var group = new BsonDocument
                    {
                        { "_id", 0 },
                        {
                            "data", new BsonDocument {{"$push", "$items" } }

                        }
            };


            var project = new BsonDocument
            {
                {"items", new BsonDocument
                    {
                        { "$reduce", new BsonDocument
                            {
                                { "input", "$data"},
                                { "initialValue", new BsonArray()},
                                { "in", new BsonDocument { {"$setUnion", new BsonArray { "$$value", "$$this" }}}}
                            }
                        }
                    }
                }
            };



            var result = qaCollection.Aggregate()
                .Match(Builders<QAList>.Filter.In(x => x.Id, list))
                .Group(group)
                .Project(project)
                .FirstOrDefault();
var组=新的b文档
{
{u id',0},
{
“数据”,新的BsonDocument{{“$push”,“$items”}
}
};
var项目=新的BsonDocument
{
{“项目”,新的B文件
{
{“$reduce”,新的B文件
{
{“输入”,“$data”},
{“initialValue”,新的BsonArray()},
{“in”,新的BsonDocument{{“$setUnion”,新的BsonArray{“$$value”,“$$this”}}
}
}
}
}
};
var result=qaCollection.Aggregate()
.Match(Builders.Filter.In(x=>x.Id,list))
.集团(集团)
.项目(项目)
.FirstOrDefault();
此查询需要一些时间,因为它可能返回大数据。所以,如果我能传递多个集合,它将合并单独的集合并使它们相交,这样数据就不会太大而无法返回,这将非常好

提前感谢。

根据以下内容回答:

MongoDB中没有跨多个不同文档自动进行交集的功能。但是,可以采用这种方法计算交叉口:

  • 请注意相交的文档数
  • 展开项目数组
  • 计算每个项目的发生次数
  • 仅匹配出现次数与步骤1中的文档数匹配的项目
  • 例如,如果您在3个文档中取项目的交集,那么您可以展开这些项目,计算每个项目出现的次数,并仅以出现3次的项目结束

    当然,这仅在每个文档的items数组没有重复项时才起作用

    例如,如果源数据如下所示:

    db.test\u unioncrossion\u stackoverflow\u 42686348.insert([
    {u id:1,
    “项目”:[10,20,30,40,50]},
    {u id:2,
    “项目”:[20,30,40,50,60,70,80],
    {u id:3,
    “项目”:[10,40,50,60,80]},
    {u id:4,
    “项目”:[20、30、40、70、80]}
    ])
    
    然后,如果需要文档1、2、3的交集(例如),则需要结果
    [40、50]

    你可以这样计算:

    var文档_id=[1,2,3];
    var number\u documents=文档id.length;
    db.test_union交叉口_stackoverflow_42686348.aggregate([
    {“$match”:{“{u id”:{“$in”:document{u id}},
    {“$unwind”:“$items”},
    {“$project”:{“_id”:0,“item”:“$items”},
    {“$group”:{{U id:$item”,“count:{$sum:1}}},
    {“$match”:{“count”:文件数},
    {“$group”:{{U id:“交叉点”,“项目”:{$push:$U id”}},
    ]);
    
    结果如下:

    {
    “_id”:“交叉口”,
    “项目”:[
    50.0, 
    40
    ]
    }