Node.js 如何返回从MongoDb中的一个数组筛选出的多个数组

Node.js 如何返回从MongoDb中的一个数组筛选出的多个数组,node.js,database,mongodb,aggregation,Node.js,Database,Mongodb,Aggregation,我在MongoDb数据库中有一些数据,正在使用NodeJS MongoDb本机驱动程序访问它 user: { _id: ****Example Id**** name: 'Foo bar', examScores: [ { subject: 'Geography', score: 80, teacher: 'Mr Foo', date: 'somedate'}, { subject: 'History', score: 57, teache

我在MongoDb数据库中有一些数据,正在使用NodeJS MongoDb本机驱动程序访问它

user: {
    _id: ****Example Id****
    name: 'Foo bar',
    examScores: [
        { subject: 'Geography', score: 80, teacher: 'Mr Foo', date: 'somedate'},
        { subject: 'History', score: 57, teacher: 'Mrs Bar', date: 'somedate'},
        { subject: 'Maths', score: 43, teacher: 'Mrs Fizz', date: 'somedate'},
        { subject: 'Geography', score: 43, teacher: 'Mr Buzz', date: 'somedate'},
        { subject: 'Geography', score: 78, teacher: 'Mr Foo', date: 'somedate'},
        { subject: 'History', score: 41, teacher: 'Mr Buzz', date: 'somedate'}
    ]
}
我想检索每个科目的前十名分数/考试。为了简洁起见,我在这个例子中没有包括超过十次的考试尝试

比如:

user: {
    _id: ****Example Id****
    name: 'Foo bar',
    grades: [
        { subject: 'Geography', exams: [ 
            { score: 80, teacher: 'Mr Foo', date: 'somedate' },
            { score: 78, teacher: 'Mr Foo', date: 'somedate' },
            { score: 43, teacher: 'Mr Buzz', date: 'somedate' }
            ]
        },
        { subject: 'History', exams: [
            { score: 57, teacher: 'Mrs Bar', date: 'somedate' },
            { score: 41, teacher: 'Mr Buzz', date: 'somedate'}
            ]
        },
        { subject: 'Maths', exams: [
            { score: 43, teacher: 'Mrs Fizz', date: 'somedate'}
            ]
        }
    ]
}       

请尝试此查询,希望能有所帮助。我使用了,然后聚合数据

db.collection.aggregate([ {$unwind:"$examScores"}, 

{$group:{"_id":"$examScores.subject",name: { $first: "$name" }, exams: { 

$addToSet:{ teacher: '$examScores.teacher' 

,score:'$examScores.score',date:'$examScores.date' } }}},

{$group:{"_id":null,name: { $first: "$name" }, "grades":{$push: 

{"subject":"$_id", "exams":"$exams"}}}},

{$project:{"_id":0,"grades":1,"name":1}} ])
我得到的预期输出在本地机器上

{
  "name": "Foo bar",
  "grades": [
    {
      "subject": "History",
      "exams": [
        {
          "teacher": "Mr Buzz",
          "score": 41,
          "date": "somedate"
        },
        {
          "teacher": "Mrs Bar",
          "score": 57,
          "date": "somedate"
        }
      ]
    },
    {
      "subject": "Maths",
      "exams": [
        {
          "teacher": "Mrs Fizz",
          "score": 43,
          "date": "somedate"
        }
      ]
    },
    {
      "subject": "Geography",
      "exams": [
        {
          "teacher": "Mr Foo",
          "score": 78,
          "date": "somedate"
        },
        {
          "teacher": "Mr Buzz",
          "score": 43,
          "date": "somedate"
        },
        {
          "teacher": "Mr Foo",
          "score": 80,
          "date": "somedate"
        }
      ]
    }
  ]
}

请尝试以下查询:

  • 展开ExamCores阵列
  • 根据主题和分数按降序对集合进行排序 你需要每个科目的成绩按分数降序排列
  • 基于主题的分组结果
  • 因为你只需要列出每个科目的前10名最高分数 您可以使用操作限制前10个最高分 每一个科目

    db.collection.aggregate([ 
    
                   { $unwind : "$examScores" },
                   { $sort : 
                           { "examScores.subject" : 1, 
                             "examScores.score" : -1
                           }
                   }, 
                   { $group : { 
                              "_id" : "$examScores.subject",
                              "name" : { $first: "$name" }, 
                              "examsAll" : { 
                                     $addToSet : { 
                                            teacher: '$examScores.teacher',
                                            score : '$examScores.score',
                                            date : '$examScores.date' 
                                                 } 
                                           }
                                }
                   },
                   { $project : { 
                                 "_id" : 1, 
                                 "name" : 1, 
                                 "exams" : { $slice: [ "$examsAll", 10 ] } 
                                }
                   },
                   { $group : { "_id" : null, 
                                "name" :  { $first: "$name" }, 
                                "grades" : { $push: 
                                                 { "subject" : "$_id", 
                                                   "exams" : "$exams" 
                                                 }
                                           }
                               }
                   },
                   { $project : { "_id" : 0,
                                  "grades" : 1,
                                  "name" : 1
                                }
                   } 
         ]);