首页 > 解决方案 > 获取在集合中排序的唯一文档

问题描述

我有一个带有以下文件的 mongo 集合“学生”

`{
    "_id" : ObjectId("5d006ed8506fe860333c5aa2"),
    "studentId" : "123",
    "examName" : "abc",
    "marks" : 56,
    "isLatest" : 34343,
    "examStatus" : "Completed",
    "addedOn" : ISODate("2019-06-09T07:02:00.650Z")
}
{
    "_id" : ObjectId("5d006ed8506fe860333cwewew2"),
    "studentId" : "123",
    "examName" : "abc",
    "marks" : 57,
    "isLatest" : 45454,
    "examStatus" : "Completed",
    "addedOn" : ISODate("2019-06-10T07:02:00.650Z")
}
{
    "_id" : ObjectId("5d006ed8506fe860333c5aa5"),
    "studentId" : "123",
    "examName" : "def",
    "marks" : 56,
    "isLatest" : 4434,
    "examStatus" : "Completed",
    "addedOn" : ISODate("2019-06-10T07:02:00.650Z")
}
{
    "_id" : ObjectId("5d006ed8506fe860333c5aa8"),
    "studentId" : "123",
    "examName" : "def",
    "isLatest" : 1,
    "examStatus" : "Under progress",
    "addedOn" : ISODate("2019-06-11T07:02:00.650Z")
}
{
    "_id" : ObjectId("5d00708a506fe860333c5ad9"),
    "studentId" : "456",
    "examName" : "def",
    "marks" : 56,
    "isLatest" : 1,
    "examStatus" : "Completed",
    "addedOn" : ISODate("2019-06-10T07:02:00.650Z")
}`

现在我想在examStatus 完成的examName 上获取文档的最新唯一数据基础。例如,examName:def 查询应返回以下文档

`{
    "_id" : ObjectId("5d00708a506fe860333c5ad9"),
    "studentId" : "456",
    "examName" : "def",
    "marks" : 56,
    "isLatest" : 1,
    "examStatus" : "Completed",
    "addedOn" : ISODate("2019-06-10T07:02:00.650Z")
}`

对于 testName "abc" 它应该返回

`{
    "_id" : ObjectId("5d006ed8506fe860333cwewew2"),
    "studentId" : "123",
    "examName" : "abc",
    "marks" : 57,
    "isLatest" : 45454,
    "examStatus" : "Completed",
    "addedOn" : ISODate("2019-06-10T07:02:00.650Z")
}`

如果考试状态为 underprogress 的文档更改为已完成,如下所示

{
    "_id" : ObjectId("5d006ed8506fe860333c5aa8"),
    "studentId" : "123",
    "examName" : "def",
    "marks" : 99,
    "isLatest" : 1,
    "examStatus" : "Completed",
    "addedOn" : ISODate("2019-06-11T07:02:00.650Z")
}

然后学生的examName def 和examStatus completed 的输出应该返回我

{
    "_id" : ObjectId("5d00708a506fe860333c5ad9"),
    "studentId" : "456",
    "examName" : "def",
    "marks" : 56,
    "isLatest" : 1,
    "examStatus" : "Completed",
    "addedOn" : ISODate("2019-06-10T07:02:00.650Z")
}
{
    "_id" : ObjectId("5d006ed8506fe860333c5aa8"),
    "studentId" : "123",
    "examName" : "def",
    "marks" : 99,
    "isLatest" : 1,
    "examStatus" : "Completed",
    "addedOn" : ISODate("2019-06-11T07:02:00.650Z")
}

到目前为止我尝试过的以下查询

db.getCollection('Student').aggregate([ { "$sort" : { "addedOn" : -1}}, { "$match" : {"examName" : "def"} } ])

标签: javamongodb

解决方案


试试这个方法,

db.Student.find({examName:"def", examStatus:"Completed"}).sort({addedOn : -1}).limit(1)

否则要获取最新值,您可以按 ObjectId 排序。您可以这样做,因为 ObjectId 的 4 字节值表示自 Unix 纪元以来的秒数,

db.Student.find({examName:"def", examStatus:"Completed"}).sort({_id : -1}).limit(1)

更新

我认为你不能通过一个查询来做到这一点。尝试使用两个查询,

var student = db.Student.findOne({examName:"abc", examStatus:"Completed"})
db.Student.find({"addedOn" : {$gte : student.addedOn}, "examName" : {$eq : student.examName}, "examStatus" : {$eq : student.examStatus}});

推荐阅读