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
23def _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()