java - 获取在集合中排序的唯一文档
问题描述
我有一个带有以下文件的 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"} }
])
解决方案
试试这个方法,
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}});
推荐阅读
- optimization - 如何查看llvm优化前后的差异 Selectiondag
- php - 在单独的进程中运行测试时,PHPUnit 无法生成代码覆盖率
- json - 通过 Ecvel 使用 Hayperlink Funktion 发送 JSON 有效负载 - 问题
- android - 导入项目时无法点击完成按钮
- r - 如何叠加两个具有相同尺寸的数据框,将值粘贴到相应的单元格中?
- python - Pandas - 将数据附加到数据框会导致比文件源更多的行
- python - Snakemake 在开始下一个并行作业之前等待完成所有并行作业
- php - 警告:PHP 中未定义的数组键错误
- reactjs - eslint@typescript-eslint/no-unsafe-return 在使用内联 require() 语句时抛出错误消息
- javascript - 从左到右移动img,停止5秒改变img然后继续用旧的img agin vanilla js向右移动