Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.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
MongoDB Aggregate获取特定考试中存在的用户数,并确保该考试中的职位数_Mongodb_Aggregation Framework_Aggregate - Fatal编程技术网

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
更改该字段名。