0%

[mongo] 2. skip、limit and sort

skip(), limit() 和 sort()操作#

MongoDB使用find()方法查询后,可能需要对于返回结果进行排序。在有些查询中,我们并不需要返回全部结果,而是按指定的页长和页码返回指定数量的结果。本节来学习一下 查询操作中常用的 skip(), limit() 和 sort()操作。

limit()#

  • find()方法查询文档后,其默认返回前20条数据
  • 要限制MongoDB查询结果数,使用limit()方法, 读取指定数量的数据,如返回 NUMBER条数据:
1
db.COLLECTION_NAME.find().limit(NUMBER)

skip()#

  • 跳过指定数量的数据, 指定查询偏移量
  • 通过搭配limit() , 可以实现分页查询
1
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

sort()#

  • 实现查询结果排序
  • 使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列
1
db.COLLECTION_NAME.find().sort({KEY:1})

MongoDB 数据分页#

使用 skip(), limit() 和 sort()组合#

1
db.myCollection.find().sort({"_id":1}).skip(10).limit(10)
  • sort将数据根据_id排序

  • skip指跳过前10条记录,也可以说是从第10条开始

  • limit限制查询10条数据

  • 结果为按_id升序排序后的第10-19条的数据

然而, 根据MongoDB 数据分页和排序 limit,skip,sort用户测试结果而言: skip的大小严重影响性能,应该严格避免特别大的skip操作

避免比较大的skip操作#

分页查询时,可以记录上一条查询的score值,用如下方法获取数据(按score降序取数据):

1
db.scores.find({lid: lid, score: {$lt: last_score}}).sort({score: -1}).limit(20)

分批加载数据#

下面仅为实现思路, 不是正确的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def _load_callback(infos):
if infos:
next_id = None
for info in infos:
uid = info.get('_id')
...
next_id = uid

if len(infos) < 1000:
pass # do finish operation
else:
# continue load
self._load_db(next_id) # 记录上一条查询的id值
else:
pass # do finish operation

def _load_db(self, begin_id=''):
"""分批加载数据,batch_size=1000"""

infos = db.COLLECTION_NAME.find({'_id': {'$gt': begin_id,}}).sort({'_id': 1}).limit(1000)
self._load_callback(infos)

self._load_db()