【问题标题】:MongoDB REST API dynamic data paginationMongoDB REST API 动态数据分页
【发布时间】:2017-05-30 13:23:29
【问题描述】:

我正在使用 Express 和 Mongoose 实现 REST API。我的任务是对包含大量文档的集合的结果进行分页。文档是一个社交媒体帖子,具有以下字段:created_at、updated_at 和 score。

由于数据的性质,使用限制和页码的普通分页实现不起作用。用户在浏览结果时可以删除或添加帖子。

我可以按照 MongoDB 文档中的建议实现基于范围的分页。 页面中的最后一项 created_at 值可用于查询下一页。

Post.find({ created_at: { $gt: req.query.next } })

但是如果我想按不是唯一的或所有分数相同的 score 对结果进行排序怎么办?

【问题讨论】:

  • Mongo cursor.sort() 可以根据多个字段进行排序
  • 例如,我提出了一个问题。我找不到使它起作用的组合键。按 created_at 排序,分数没有区别。

标签: mongodb rest express mongoose


【解决方案1】:

有多种方法可以做到这一点,但在您的情况下,我建议动态创建查找/排序条件并在您的查找语句中使用它们。

为了给你一个想法,我的脑袋:

var MyFilter = {};
var MySort = {};
if (req.query.created_at != undefined) {
    MyFilter = { created_at : { $gte : req.query.created_at) } };
}

if (req.query.sortOn != undefined){
    MySort = { req.query.sort : 1 };
}

Post.find(MyFilter)
.sort(MySort)
.exec(function (err, posts) {
    ===do your stuff===
});

【讨论】:

    【解决方案2】:

    https://groups.google.com/forum/#!searchin/mongodb-user/paging%7Csort:relevance/mongodb-user/_Jrv9vI1lDE/Wg0eGV2AkZYJ

    我刚刚在谷歌群组中找到了相同的主题并有完美的答案。

    您可以尝试在 age 和 _id 上创建复合索引,并按两个字段排序以获取前三个文档。要获取后续用户集,您的查询应返回满足以下任一要求的文档:

    • 与最后一个文档的年龄相同,并且具有更大的_id 或
    • 年龄更大

    例如(lastAge 和 lastID 是最新用户的年龄和_id):

    db.collection.find( { $or : [ { age : lastAge, _id : {$gt : lastID } } , { age : {$gt : lastID } } ] } )

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 2022-08-03
      相关资源
      最近更新 更多