Node.js 如何返回从MongoDb中的一个数组筛选出的多个数组
我在MongoDb数据库中有一些数据,正在使用NodeJS 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
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"
}
]
}
]
}
请尝试以下查询:
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
}
}
]);