MongoDB:如何在 mongo 中查找最大排序文档

问题描述 投票:0回答:1

我在名为“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"
}

请让我知道如何实现这一目标。

mongodb mongodb-query aggregation-framework
1个回答
0
投票

您可以使用

$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游乐场供您参考。

© www.soinside.com 2019 - 2024. All rights reserved.