MongoDB Limit与Skip方法


MongoDB Limit() 方法

如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。

语法

limit()方法基本语法如下所示:

>db.COLLECTION_NAME.find().limit(NUMBER)
db.COLLECTION_NAME.find().limit(NUMBER)
 

实例

集合 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 }
"_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 教程" }

>
db.col.find({},{"title":1,_id:0}).limit(2) { "title" : "PHP 教程" } { "title" : "Java 教程" } >

注:如果你们没有指定limit()方法中的参数则显示集合中的所有数据。


MongoDB Skip() 方法

我们除了可以使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。

语法

skip() 方法脚本语法格式如下:

>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)

db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
 

实例

以下实例只会显示第二条文档数据



>db.col.find({},{"title":1,_id:0}).limit(1).skip(1)

{ "title" : "Java 教程" }

>
db.col.find({},{"title":1,_id:0}).limit(1).skip(1) { "title" : "Java 教程" } >
 

注:skip()方法默认参数为 0 。

 MongoDB $type 操作符

MongoDB 排序 

 

笔记列表

  1.    天堂人_2008

      yan***n_xi@163.com

    db.col.find({},{"title":1,_id:0}).limit(2)
    .col.find({},{"title":1,_id:0}).limit(2)
     

    补充说明:

    • 第一个 {} 放 where 条件,为空表示返回集合中所有文档。
    • 第二个 {} 指定那些列显示和不显示 (0表示不显示 1表示显示)。
    天堂人_2008

       天堂人_2008

      yan***n_xi@163.com

    10个月前 (04-17)
  2.    joyran

      xin***iyihan@126.com

    想要读取从 10 条记录后 100 条记录,相当于 sql 中limit (10,100)。

    > db.COLLECTION_NAME.find().skip(10).limit(100)
     db.COLLECTION_NAME.find().skip(10).limit(100)
     

    以上实例在集合中跳过前面 10 条返回 100 条数据。

    skip 和 limit 结合就能实现分页。

    joyran

       joyran

      xin***iyihan@126.com

    10个月前 (04-20)
  3.    幸福的小公猪

      pei***gfengzy@126.com

    当查询时同时使用sort,skip,limit,无论位置先后,最先执行顺序 sort再skip再limit。

    幸福的小公猪

       幸福的小公猪

      pei***gfengzy@126.com

    7个月前 (07-06)
  4.    dragon

      lib***uan_87@126.com

       参考地址

    补充说明skip和limit方法只适合小数据量分页,如果是百万级效率就会非常低,因为skip方法是一条条数据数过去的,建议使用where_limit

    在查看了一些资料之后,发现所有的资料都是这样说的:

    不要轻易使用Skip来做查询,否则数据量大了就会导致性能急剧下降,这是因为Skip是一条一条的数过来的,多了自然就慢了。

    这么说Skip就要避免使用了,那么如何避免呢?首先来回顾SQL分页的后一种时间戳分页方案,这种利用字段的有序性质,利用查询来取数据的方式,可以直接避免掉了大量的数数。也就是说,如果能附带上这样的条件那查询效率就会提高,事实上是这样的么?我们来验证一下:

    这里我们假设查询第100001条数据,这条数据的Amount值是:2399927,我们来写两条语句分别如下:

    
    
    b.test.sort({"amount":1}).skip(100000).limit(10) //183ms
    
    db.test.find({amount:{$gt:2399927}}).sort({"amount":1}).limit(10) //53ms
    .test.sort({"amount":1}).skip(100000).limit(10) //183ms db.test.find({amount:{$gt:2399927}}).sort({"amount":1}).limit(10) //53ms
     

    结果已经附带到注释了,很明显后者的性能是前者的三分之一,差距是非常大的。也印证了Skip效率差的理论。

    可以联系邮箱 libaoyuan_87@126.com,互相学习。

    dragon

       dragon

      lib***uan_87@126.com

       参考地址

    5个月前 (09-14)
  5.    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),在符合条件的文档中,先跳过第一条文档,然后显示两条文档,这样比较好理解。

 

 

学完还想练?点这里!