我有一个集合,我想通过使用datecreated字段将其排序为decenting来进行分页查询,以获取最新文档。
我等着呢 lastKnownCommentId
(对象id)用于性能目的。有 lastKnownCommentId
避免在下次分页时再次加载文档,如果没有,则应用 limit
on查询将导致性能问题。
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
}
}
);
1条答案
按热度按时间lymgl2op1#
是什么
query
看起来像是在你还它之前(打印出值,如果是对象,则执行for循环,这样您就可以看到值是什么)。