MongoDB Aggregate获取特定考试中存在的用户数,并确保该考试中的职位数
我有这样一个数据集:MongoDB Aggregate获取特定考试中存在的用户数,并确保该考试中的职位数,mongodb,aggregation-framework,aggregate,Mongodb,Aggregation Framework,Aggregate,我有这样一个数据集: [ { "_id" : ObjectId("5fa506a9fe8d8429b0f7a85c"), "userid" : "5c35f1045643180d9488112f", "pt" : 2, "date" : ISODate("2021-02-28T08:17:45.489Z"), &q
[
{
"_id" : ObjectId("5fa506a9fe8d8429b0f7a85c"),
"userid" : "5c35f1045643180d9488112f",
"pt" : 2,
"date" : ISODate("2021-02-28T08:17:45.489Z"),
"wtg" : 0.92,
"rank" : 1
},
{
"_id" : ObjectId("5fa506a9fe8d8429b0f7a85d"),
"userid" : "5c35f1045643180d9488112g",
"pt" : 2,
"date" : ISODate("2021-02-28T08:17:45.489Z"),
"wtg" : 0.82,
"rank" : 2
},
{
"_id" : ObjectId("5fa506a9fe8d8429b0f7a85e"),
"userid" : "5c35f1045643180d9488112f",
"pt" : 1,
"date" : ISODate("2021-02-28T08:17:45.489Z"),
"wtg" : 0.92,
"rank" : 1
},
{
"_id" : ObjectId("5fa506a9fe8d8429b0f7a85f"),
"userid" : "5c35f1045643180d9488112f",
"pt" : 3,
"date" : ISODate("2021-02-28T08:17:45.489Z"),
"wtg" : 21.92,
"rank" : 1
},
{
"_id" : ObjectId("5fa506a9fe8d8429b0f7a85g"),
"userid" : "5c35f1045643180d9488112f",
"pt" : 3,
"date" : ISODate("2021-02-28T08:17:45.489Z"),
"wtg" : 10.92,
"rank" : 2
},
{
"_id" : ObjectId("5fa506a9fe8d8429b0f7a85h"),
"userid" : "5c35f1045643180d9488112f",
"pt" : 4,
"date" : ISODate("2021-02-28T08:17:45.489Z"),
"wtg" : 1002,
"rank" : 1
}
]
我有四种考试类型,即1分,2分,3分,4分
现在我想要列表中所有用户的结果,以及该考试用户安全等级1、2或3的次数
虚拟预期答案:
假设参加pt的任何用户:1次考试,3次获得第一名,1次获得第二名,5次获得第三名
[
{
pt: 2,
users: [
{ uid: '5c35f1045643180d9488112f', rank1: 3, rank2: 1, rank3: 5 },
{ uid: '5c35f1045643180d9488113g', rank1: 0, rank2: 15, rank3: 2 },
]
}
]
我尝试的只是为了代表userid
重复。我不知道如何编写适当的查询来实现这一点:
db.CollectionName.aggregate(
[
{
$facet: {
groupByPage: [
{ $unwind: '$_id' },
{
$group: {
_id: '$_id',
count: { $sum: 1 },
},
},
],
}
}
]
)
任何人都可以用正确的方法指导我,并分享可理解性的步骤。您可以使用单个
$group
阶段,在该阶段中,以秩值为条件求和,如下所示:
db.collection.aggregate([
{
$group: {
_id: {
user: "$userid",
exam: "$pt"
},
rank1: {
$sum: {
$cond: [
{
$eq: [
"$rank",
1
]
},
1,
0
]
},
},
rank2: {
$sum: {
$cond: [
{
$eq: [
"$rank",
2
]
},
1,
0
]
},
},
rank3: {
$sum: {
$cond: [
{
$eq: [
"$rank",
3
]
},
1,
0
]
},
}
}
},
{
$group: {
_id: "$_id.exam",
users: {
$push: {
uud: "$_id.user",
rank1: "$rank1",
rank2: "$rank2",
rank3: "$rank3"
}
}
}
}
])
Hey@Tom,我有一个关于你分享的方法的问题,在这里我还想提一下这个结果是针对哪个考试的,比如pt:1没有多少数据,pt:2有等等,你在问什么?您希望从未参加过考试的用户在考试中使用
rank1:0,rank2:0,rank3:0
?您的答案是正确的,但不是正常的id:1,2,3我想要与pt类型相关的结果:因为pt是单独的考试,我想要参加该考试的所有用户的答案,并代表排名保持获得重复。例子。在pt:1考试中,10名用户参加。用户可以多次参加该考试。现在,在结束时,我想知道参加特定考试的总用户,其中我想知道他们在哪个位置得分多少次\u id
是pt
类型,您可以使用$project
更改该字段名。