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中没有跨多个不同文档自动进行交集的功能。但是,可以采用这种方法计算交叉口:
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
]
}