Java 在集合中通过排序获取唯一文档
我有一个mongo收藏“Student”,里面有以下文件Java 在集合中通过排序获取唯一文档,java,mongodb,Java,Mongodb,我有一个mongo收藏“Student”,里面有以下文件 `{ "_id" : ObjectId("5d006ed8506fe860333c5aa2"), "studentId" : "123", "examName" : "abc", "marks" : 56, "isLatest" : 34343, "examStatus" : "Completed", "addedOn" : ISODate("2019-06-09T07:02:00.
`{
"_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")
}`
如果检查状态为“正在进行”的文档更改为“已完成”,则如下所示
{
"_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'。聚合[
{$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}});
这将始终只给我一个文档。id为的文档将examstatus从“正在处理”更改为“已完成”,然后输出应该是具有以下id的文档`{{u id:ObjectId5d00708a506fe860333c5ad9}{{u id:ObjectId5d006ed8506fe860333c5aa8}如果需要多个文档,只需删除limit1函数即可。然后它会给出所有相关的文件。然后它会给出所有三个文件,其中两个文件是给学生的。ID:123但对于这一点,我只需要一个带有最新附录的文件。现在我明白你的问题了。我已经编辑了答案。试试看。