我在名为“Student”的集合中有以下 MongoDB 文档。 本文档包含有关学生的详细信息和修订信息。我基本上想根据某些过滤条件从中获得最大序列。
{
"student": {
name : "Rahul",
age : 18,
department : "CSE",
section : "B"
},
"sequence": 0,
"student_ref": "AUTCSE024",
"college" : "AUT"
}
{
"student": {
name : "Rahul",
age : 18,
department : "CSE",
section : "A"
},
"sequence": 1,
"student_ref": "AUTCSE024",
"college" : "AUT"
}
{
"student": {
name : "Kumar",
age : 18,
department : "IT",
section : "A"
},
"sequence": 0,
"student_ref": "AUTITE011",
"college" : "AUT"
}
{
"student": {
name : "Kumar",
age : 18,
department : "IT",
section : "C"
},
"sequence": 1,
"student_ref": "AUTITE011",
"college" : "AUT"
}
{
"student": {
name : "Praveen",
age : 18,
department : "IT",
section : "C"
},
"sequence": 0,
"student_ref": "AUTITE016",
"college" : "AUT"
}
{
"student": {
name : "Praveen",
age : 18,
department : "IT",
section : "C"
},
"sequence": 1,
"student_ref": "AUTITE016",
"college" : "AUT"
}
所以从上面的文档中,我想要基于 max(sequence) 和 "student.department" : "IT" 的输出。预期的结果应该是
{
"student": {
name : "Kumar",
age : 18,
department : "IT",
section : "C"
},
"sequence": 1,
"student_ref": "AUTITE011",
"college" : "AUT"
}
{
"student": {
name : "Praveen",
age : 18,
department : "IT",
section : "C"
},
"sequence": 1,
"student_ref": "AUTITE016",
"college" : "AUT"
}
请让我知道如何实现这一目标。
您可以使用
$lookup
中的子管道来聚合最大序列号。然后通过将 sequence
字段与聚合的最大序列号进行匹配来过滤学生结果。
db.collection.aggregate([
{
"$match": {
"student.department": "IT"
}
},
{
"$lookup": {
"from": "collection",
"let": {
"student_ref": "$student_ref"
},
"pipeline": [
{
$match: {
$expr: {
$and: [
{
$eq: [
"$$student_ref",
"$student_ref"
]
},
// put your filtering condition here too
{$eq: [
"$student.department",
"IT"
]
}
]
}
}
},
{
"$group": {
"_id": "$student_ref",
"maxSeqNum": {
"$max": "$sequence"
}
}
}
],
"as": "maxSeqNumLookup"
}
},
{
"$unwind": "$maxSeqNumLookup"
},
{
$match: {
// get only the student record with max sequence number
$expr: {
$eq: [
"$maxSeqNumLookup.maxSeqNum",
"$sequence"
]
}
}
},
{
"$project": {
// formatting the final output
"student": 1,
"sequence": "$maxSeqNumLookup.maxSeqNum",
"student_ref": 1,
"college": 1
}
}
])
这里是Mongo游乐场供您参考。