繁体   English   中英

在字段 mongodb 上进行排序时出现分页问题

[英]Problem doing pagination with sorting on field mongodb

我有一个集合,我想通过使用 dateCreated 字段对其进行排序以获取最新文档来进行分页查询。

出于性能目的,我持有lastKnownCommentId (Object 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 循环,以便您可以看到这些值是什么)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM