我有一个集合,我想通过用dateCreated字段对其进行排序来进行分页查询,以获取最新文档。
我持有lastKnownCommentId
(对象id(用于表演目的。使用lastKnownCommentId
可以避免在下一次分页期间重新启动加载文档,如果没有,则在查询中应用limit
将导致性能问题。
Query<Comment> query = datastore.createQuery(Comment.class)
.field(POST_ID).equal(postId);
if (lastKnownCommentId != null) {
query.field(FieldConstants.OBJECT_ID).greaterThan(new ObjectId(lastKnownCommentId));
}
query.order(Sort.descending(FieldConstants.DATE_CREATED));
return query.asList(new FindOptions().limit(10));
现在我在这个集合中有12个文档,与一个postId
相匹配。当这个查询超过lastKnownCommentId=null
的第一次分页时,它会给我10个按日期排序的文档,其中2个文档仍然不在分页图片中。
对于lastKnownCommentId=someId
的第二次分页(someId是从第一次分页中获得的最后一个文档的对象id(,它再次给了我9个文档,而不是第一次分页时留下的2个文档。
如果我不按日期排序,事情会很好,我可以完全跳过这个排序,改为对数组列表进行排序。我不明白为什么查询中的排序会发生这种情况。
我试着用聚合进行交叉检查,结果相同。
db.comment.aggregate(
// Pipeline
[
// Stage 1
{
$match: {
"postId":{"$eq":"5fb2090fe4d37312a4c3ce59"}
}
},
// Stage 2
{
$sort: {
"dateCreated":-1
}
},
// Stage 3
{
$match: {
"_id":{"$gt":ObjectId("5fb0e53392ad724f9026d2f7")}
}
},
// Stage 4
{
$limit: // positive integer
10
},
],
// Options
{
cursor: {
batchSize: 50
}
}
);
query
在返回之前是什么样子的?(打印出值,或者如果它是一个对象,则执行for循环,以便查看值(。