我可以从 MongoDb 中获得前 10 名的组列表吗,它是按成员数排序的
Can I get top 10 group list from MongoDb which is order by members count
我有 2 个集合,一个是组详细信息,另一个是 group_members 详细信息,
group_members 已存储组的 _id(作为 FK)
赞
组 : -> _id,name,type,date
group_members -> _id,group_id,members_id,角色,状态
那么我怎样才能得到其中拥有最多 memebrs 的组,并按 group_membrs 的计数排序(成员最多的前 10 个组)
因此,如果 groupMembers
集合包含您描述的组 ID,例如:
var r = [
{_id: "M1", gid: "A", member: "Bob"}
,{_id: "M2", gid: "A", member: "Sally"}
,{_id: "M3", gid: "A", member: "Dan"}
,{_id: "M4", gid: "B", member: "Tess"}
,{_id: "M5", gid: "B", member: "George"}
,{_id: "M6", gid: "C", member: "P_1"}
,{_id: "M7", gid: "C", member: "P_2"}
,{_id: "M8", gid: "C", member: "P_3"}
,{_id: "M9", gid: "C", member: "P_4"}
];
db.foo2.insert(r);
那么这就是您在每组中获得计数的方式:
c=db.foo2.aggregate([
{$group: {_id: "$gid", n: {$sum:1} }}
,{$sort: {n: -1}}
,{$limit: 10}
]);
如果我们在群主合集里折腾,比如
var r = [
{_id: "A", name: "GroupA"}
,{_id: "B", name: "GroupB"}
,{_id: "C", name: "GroupC"}
];
db.foo.insert(r);
然后我们简单地对"join"数据做一个$lookup
:
db.foo2.aggregate([
{$group: {_id: "$gid", n: {$sum:1} }}
,{$sort: {n: -1}}
,{$limit: 10}
,{$lookup: { from: "foo", localField: "_id", foreignField: "_id", as: "X"}}
]);
这将产生类似这样的结果:
{
"_id" : "C",
"n" : 4,
"X" : [
{
"_id" : "C",
"name" : "GroupC"
}
]
}
{
"_id" : "A",
"n" : 3,
"X" : [
{
"_id" : "A",
"name" : "GroupA"
}
]
}
我有 2 个集合,一个是组详细信息,另一个是 group_members 详细信息, group_members 已存储组的 _id(作为 FK)
赞 组 : -> _id,name,type,date
group_members -> _id,group_id,members_id,角色,状态
那么我怎样才能得到其中拥有最多 memebrs 的组,并按 group_membrs 的计数排序(成员最多的前 10 个组)
因此,如果 groupMembers
集合包含您描述的组 ID,例如:
var r = [
{_id: "M1", gid: "A", member: "Bob"}
,{_id: "M2", gid: "A", member: "Sally"}
,{_id: "M3", gid: "A", member: "Dan"}
,{_id: "M4", gid: "B", member: "Tess"}
,{_id: "M5", gid: "B", member: "George"}
,{_id: "M6", gid: "C", member: "P_1"}
,{_id: "M7", gid: "C", member: "P_2"}
,{_id: "M8", gid: "C", member: "P_3"}
,{_id: "M9", gid: "C", member: "P_4"}
];
db.foo2.insert(r);
那么这就是您在每组中获得计数的方式:
c=db.foo2.aggregate([
{$group: {_id: "$gid", n: {$sum:1} }}
,{$sort: {n: -1}}
,{$limit: 10}
]);
如果我们在群主合集里折腾,比如
var r = [
{_id: "A", name: "GroupA"}
,{_id: "B", name: "GroupB"}
,{_id: "C", name: "GroupC"}
];
db.foo.insert(r);
然后我们简单地对"join"数据做一个$lookup
:
db.foo2.aggregate([
{$group: {_id: "$gid", n: {$sum:1} }}
,{$sort: {n: -1}}
,{$limit: 10}
,{$lookup: { from: "foo", localField: "_id", foreignField: "_id", as: "X"}}
]);
这将产生类似这样的结果:
{
"_id" : "C",
"n" : 4,
"X" : [
{
"_id" : "C",
"name" : "GroupC"
}
]
}
{
"_id" : "A",
"n" : 3,
"X" : [
{
"_id" : "A",
"name" : "GroupA"
}
]
}