MongoDB Limit 与 Skip 方法
MongoDB Limit() 方法
如果你需要在 MongoDB 中读取指定数量的数据记录,可以使用 MongoDB 的 limit() 方法,如果想跳过指定数量的文档读取数据可以使用 skip() 方法。
limit() 方法用于限制查询结果返回的文档数量,而 skip() 方法用于跳过指定数量的文档。这两个方法通常一起使用,可以用来实现分页查询或在大型数据集上进行分批处理。
limit() 方法
limit() 方法用于限制查询结果返回的文档数量。
语法
limit() 方法基本语法如下所示:
db.collection.find().limit(<limit>)
<limit>
:返回的文档数量。
实例
// 返回前 10 个文档
db.myCollection.find().limit(10);
db.myCollection.find().limit(10);
实例
集合 col 中的数据如下:
{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 } { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 } { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
以下实例为显示查询文档中的两条记录:
> db.col.find({},{"title":1,_id:0}).limit(2) { "title" : "PHP 教程" } { "title" : "Java 教程" } >
注:如果你们没有指定 limit() 方法中的参数则显示集合中的所有数据。
skip() 方法
我们除了可以使用 limit() 方法来读取指定数量的数据外,还可以使用 skip() 方法来跳过指定数量的数据,skip() 方法同样接受一个数字参数作为跳过的记录条数。
skip() 方法用于跳过指定数量的文档,从而实现分页或分批查询。
语法
skip() 方法语法格式如下:
db.collection.find().skip(<skip>)
<skip>
:要跳过的文档数量。
实例
// 跳过前 10 个文档,返回接下来的 10 个文档
db.myCollection.find().skip(10).limit(10);
db.myCollection.find().skip(10).limit(10);
实例
以下实例只会显示第二条文档数据
>db.col.find({},{"title":1,_id:0}).limit(1).skip(1) { "title" : "Java 教程" } >
分页查询:
实例
// 第一页,每页 10 个文档
db.myCollection.find().skip(0).limit(10);
// 第二页,每页 10 个文档
db.myCollection.find().skip(10).limit(10);
// 第三页,每页 10 个文档
db.myCollection.find().skip(20).limit(10);
db.myCollection.find().skip(0).limit(10);
// 第二页,每页 10 个文档
db.myCollection.find().skip(10).limit(10);
// 第三页,每页 10 个文档
db.myCollection.find().skip(20).limit(10);
注:skip()方法默认参数为 0 。
注意事项
skip()
和limit()
方法通常用于配合使用,以实现分页查询。但是在大型数据集上使用skip()
可能会导致性能问题,因为 MongoDB 在执行查询时需要扫描并跳过指定数量的文档,因此建议仅在需要时才使用skip()
方法,尽量避免在大型数据集上连续使用。- 当结合
skip()
和limit()
时,skip()
应该在limit()
之前使用,以避免意外行为。
通过使用 limit()
和 skip()
方法,您可以实现在 MongoDB 中对查询结果进行分页处理,提高查询的灵活性和性能。
天堂人_2008
yan***n_xi@163.com
补充说明:
天堂人_2008
yan***n_xi@163.com
joyran
xin***iyihan@126.com
想要读取从 10 条记录后 100 条记录,相当于 sql 中limit (10,100)。
以上实例在集合中跳过前面 10 条返回 100 条数据。
skip 和 limit 结合就能实现分页。
joyran
xin***iyihan@126.com
dragon
lib***uan_87@126.com
参考地址
补充说明skip和limit方法只适合小数据量分页,如果是百万级效率就会非常低,因为skip方法是一条条数据数过去的,建议使用where_limit
在查看了一些资料之后,发现所有的资料都是这样说的:
不要轻易使用Skip来做查询,否则数据量大了就会导致性能急剧下降,这是因为Skip是一条一条的数过来的,多了自然就慢了。
这么说Skip就要避免使用了,那么如何避免呢?首先来回顾SQL分页的后一种时间戳分页方案,这种利用字段的有序性质,利用查询来取数据的方式,可以直接避免掉了大量的数数。也就是说,如果能附带上这样的条件那查询效率就会提高,事实上是这样的么?我们来验证一下:
这里我们假设查询第100001条数据,这条数据的Amount值是:2399927,我们来写两条语句分别如下:
结果已经附带到注释了,很明显后者的性能是前者的三分之一,差距是非常大的。也印证了Skip效率差的理论。
可以联系邮箱 libaoyuan_87@126.com,互相学习。
dragon
lib***uan_87@126.com
参考地址
niuyongjie
niu***gjie@163.com
limit(n) 是用来规定显示的条数,而 skip(n) 是用来在符合条件的记录中从第一个记录跳过的条数,这两个函数可以交换使用。
比如:find({},{age:1,_id:0}).limit(2).skip(1),在符合条件的文档中,要显示两条文档,显示的位置从跳过第一条记录开始。这样不是很好理解。
如果写成 find({},{age:1,_id:0}).skip(1).limit(2),在符合条件的文档中,先跳过第一条文档,然后显示两条文档,这样比较好理解。
niuyongjie
niu***gjie@163.com
doc.z
bin***real@163.com
需要注意的是,此处的skip,sort,和limit三者执行顺序和位置无关,但是在聚合aggregate中使用的时候,具有管道流的特质,执行顺序是按照位置关系顺序执行的。
doc.z
bin***real@163.com
麦乐歌兜
106***4379@qq.com
下面这个拿去命令框试,更好的体现这个 skip 到底是什么意思:
find() 后出来 14 条,skip 是先将结果的前 5 条的数据清排除,然后 limit 再来限定筛选多少条。
麦乐歌兜
106***4379@qq.com