MongoDB聚合内部子集合上的组,并获取包含计数的完整文档
我有一个用户集合,它还有一个“UserSubscription”集合,还有一个“Subscription>Publication” Mongo系列看起来像这样MongoDB聚合内部子集合上的组,并获取包含计数的完整文档,mongodb,mongodb-query,aggregation-framework,mongodb-.net-driver,Mongodb,Mongodb Query,Aggregation Framework,Mongodb .net Driver,我有一个用户集合,它还有一个“UserSubscription”集合,还有一个“Subscription>Publication” Mongo系列看起来像这样 /* 1 */ { "_id" : 1, "UserSubscriptions" : [ { "_id" : 1, "Subscription" : { "_id" : 1, "Publication" : {
/* 1 */
{
"_id" : 1,
"UserSubscriptions" : [
{
"_id" : 1,
"Subscription" : {
"_id" : 1,
"Publication" : {
"_id" : 1,
"Code" : "1MM",
},
},
{
"_id" : 2,
"Subscription" : {
"_id" : 2,
"Publication" : {
"_id" : 2,
"Code" : "2MM",
},
},
{
"_id" : 7,
"Subscription" : {
"_id" : 7,
"Publication" : {
"_id" : 1,
"Code" : "1MM",
},
}
]
}
/* 2 */
{
"_id" : 2,
"UserSubscriptions" : [
{
"_id" : 3,
"Subscription" : {
"_id" : 3,
"Publication" : {
"_id" : 1,
"Code" : "1MM",
}
}
]
}
/* 3 */
{
"_id" : 3,
"UserSubscriptions" : [
{
"_id" : 4,
"Subscription" : {
"_id" : 4,
"Publication" : {
"_id" : 1,
"Code" : "1MM",
}
}
]
}
/* 4 */
{
"_id" : 4,
"UserSubscriptions" : [
{
"_id" : 5,
"Subscription" : {
"_id" : 5,
"Publication" : {
"_id" : 2,
"Code" : "2MM",
}
}
]
}
PublicationCode Count (Number of users)
1MM 3
2MM 2
我正在尝试获取所有“发布”和计数(用户订阅订阅计数)。所以从上面的集合中,我希望得到这样的结果
/* 1 */
{
"_id" : 1,
"UserSubscriptions" : [
{
"_id" : 1,
"Subscription" : {
"_id" : 1,
"Publication" : {
"_id" : 1,
"Code" : "1MM",
},
},
{
"_id" : 2,
"Subscription" : {
"_id" : 2,
"Publication" : {
"_id" : 2,
"Code" : "2MM",
},
},
{
"_id" : 7,
"Subscription" : {
"_id" : 7,
"Publication" : {
"_id" : 1,
"Code" : "1MM",
},
}
]
}
/* 2 */
{
"_id" : 2,
"UserSubscriptions" : [
{
"_id" : 3,
"Subscription" : {
"_id" : 3,
"Publication" : {
"_id" : 1,
"Code" : "1MM",
}
}
]
}
/* 3 */
{
"_id" : 3,
"UserSubscriptions" : [
{
"_id" : 4,
"Subscription" : {
"_id" : 4,
"Publication" : {
"_id" : 1,
"Code" : "1MM",
}
}
]
}
/* 4 */
{
"_id" : 4,
"UserSubscriptions" : [
{
"_id" : 5,
"Subscription" : {
"_id" : 5,
"Publication" : {
"_id" : 2,
"Code" : "2MM",
}
}
]
}
PublicationCode Count (Number of users)
1MM 3
2MM 2
我尝试了跟踪MongoDB查询并得到了结果
db.runCommand( {
aggregate: "User",
pipeline: [
{$unwind: '$UserSubscriptions'},
{$group: {_id: '$_id',pub: {$addToSet:
'$UserSubscriptions.Subscription.Publication'}}},
{$unwind: '$pub'},
{$group: {_id: '$pub.Code',pub:{$first:'$pub'}, count: {$sum: 1}}},
{$project:{_id:0,"Publication":"$pub","count":1}}
]} )
相应的C#Mongo驱动程序代码为
var unwind = new BsonDocument { { "$unwind", "$UserSubscriptions" } };
var group1 = new BsonDocument
{
{ "$group",
new BsonDocument
{
{ "_id", "$_id"
},
{
"publications", new BsonDocument
{
{
"$addToSet","$UserSubscriptions.Subscription.Publication"
}
}
}
}
}
};
var unwindCode = new BsonDocument { { "$unwind", "$publications" } };
var group2 = new BsonDocument
{
{ "$group",
new BsonDocument
{
{ "_id", "$publications.Code"
},
{
"Publications", new BsonDocument
{
{
"$first","$publications"
}
}
},
{
"NumberOfUsers", new BsonDocument
{
{
"$sum",1
}
}
}
}
}
};
var project = new BsonDocument
{
{
"$project",
new BsonDocument
{
{"_id", 0},
{"Publication","$Publications"},
{"NumberOfUsers", 1},
}
}
};
var pipeline = new[] { unwind, group1, unwindCode, group2, project };
List<BsonDocument> docs= coll.Aggregate<BsonDocument>(pipeline);
var unwind=newbsondocument{{“$unwind”,“$UserSubscriptions”};
var group1=新的BsonDocument
{
{“$group”,
新的B文件
{
{“\u id”,“$\u id”
},
{
“出版物”,新的B文件
{
{
$addToSet“,$UserSubscriptions.Subscription.Publication”
}
}
}
}
}
};
var unwindCode=新的BsonDocument{{“$unwind”,“$publications”};
var group2=新的BsonDocument
{
{“$group”,
新的B文件
{
{u id',“$publications.Code”
},
{
“出版物”,新的B文件
{
{
“$first”、“$publications”
}
}
},
{
“NumberOfUsers”,新的B文档
{
{
“$sum”,1
}
}
}
}
}
};
var项目=新的BsonDocument
{
{
“$project”,
新的B文件
{
{u id',0},
{“出版物”,“$Publications”},
{“NumberOfUsers”,1},
}
}
};
var pipeline=new[]{unwind,group1,unwindCode,group2,project};
列表单据=集合(管道);
结果“计数”与“发布”文档一致。
但是查询返回结果需要一些时间。对于5万个用户记录,大约需要23秒
请提供一些改进MongoDB查询性能的方法
(Robo 3T 1.2.1)(MongoDB.Driver 2.4.4)主要问题是您需要查看整个采集过程(在这种情况下,您不能使用索引来加快处理速度) 您可以尝试此代码(它的操作比您的代码少):
您可以检查本机mongo查询吗?得到结果需要多少时间?当尝试使用第三方库获取数据时,hppen有时会出现内存泄漏。我在尝试使用spring mongo lib从mongodb搜索数据时遇到了这个问题。这可能会帮助您。。。为您减少至少两个阶段…@AnthonyWinzlet我想返回完整的“Publication”文档和count,所以这就是为什么添加了第二组您的管道也不返回该文档的原因。。。您要求的是查询性能,而不是发布字段,这就是为什么我建议您。。。顺便说一句,您可以使用
$first
在$group
的第二阶段获取您的发布字段,我的管道正在返回该字段,请参阅我使用了相同的{$group:{{u id:'$pub.code',pub:{$first:'$pub'},count:{$sum:1}