如何在MongoDB集合中从指定ID文档起始获取n条目标数据
MongoDB 从指定文档开始查询n条数据的实现方案
你的需求属于基于锚点ID的滚动分页查询,完全可以实现,具体实现逻辑如下:
核心实现步骤
- 首先明确排序规则:选择全局唯一且有序的字段作为排序依据,你现有文档结构里的
id字段(业务ID)完全符合要求 - 构造查询条件:传入基准ID(也就是接口里的
since_id)后,过滤条件设置为id大于(如果需要包含基准文档本身则用大于等于)传入的since_id - 显式添加排序规则,保证返回结果顺序稳定
- 最后通过
limit限制返回的条数
可直接使用的代码实现
// 先从请求参数中获取since_id和limit,limit默认设为10 const { since_id, limit = 10 } = req.query; // 构造查询条件 const query = {}; if (since_id) { // 如果需要包含since_id对应的文档,把$gt改为$gte即可 query.id = { $gt: Number(since_id) }; } return new Promise((resolve, reject) => { return products_model .find(query) // 必须指定排序规则,按id升序排列,保证结果顺序稳定 .sort({ id: 1 }) .limit(Number(limit)) .exec((err, records) => { if (err) reject(err) else resolve(records) }) })
注意事项
- 必须显式指定排序规则,MongoDB默认返回结果的顺序不固定,不加排序会出现重复返回或遗漏数据的问题
- 如果你的业务需要按MongoDB自带的
_id字段作为分页锚点,只需要把过滤和排序的字段从id改为_id即可 - 如果需要实现向前翻页的逻辑,只需要把过滤条件改为
id: {$lt: 锚点ID},同时排序改为{id: -1}即可
你给出的测试接口
http://localhost:3000/products.json?since_id=30336405569734&limit=10调用后,上述代码会返回id大于30336405569734的10条按id升序排列的文档,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Deep Kakkar
相关产品推荐
相关产品推荐

