MongoDB随笔

Posted arcticboiledwater

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB随笔相关的知识,希望对你有一定的参考价值。

next遍历游标

find()命令并不直接返回结果,而是返回一个结果集的迭代器,即游标。使用

象大多数数据库产品一样,MongoDB 也是用游标来循环处理每一条结果数据,具体语法如 下:

> for( var c = db.t3.find(); c.hasNext(); ) {
... printjson( c.next());
... }

输出结果如下:

{ "_id" : ObjectId("4fb8e4838b2cb86417c9423a"), "age" : 1 }
{ "_id" : ObjectId("4fb8e4878b2cb86417c9423b"), "age" : 2 }
{ "_id" : ObjectId("4fb8e4898b2cb86417c9423c"), "age" : 3 }
{ "_id" : ObjectId("4fb8e48c8b2cb86417c9423d"), "age" : 4 }
{ "_id" : ObjectId("4fb8e48e8b2cb86417c9423e"), "age" : 5 }


skip限制返回记录的起点

从第3 条记录(不包含第三条)开始,返回5 条记录(limit 3, 5)

db.users.find().skip(3).limit(5);

举例如下:

C1 表的数据如下:

> db.c1.find()
{ "_id" : ObjectId("4fb5faaf6d0f9d8ea3fc91a8"), "name" : "Tony", "age" : 20 }
{ "_id" : ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" : "Joe", "age" : 10 }

查询users 表的第2 条数据

> db.users.find().skip(1).limit(1)


mongodb查询分页优化(二)

项目中需要用mongodb来进行数据测存储和查询,其中涉及到分页:分页的要求如下

1)每页显示10条

由于数据量太大,cursor.count()获取的符合条件的数据量也很大,导致分页得分好几万页,同时在项目中用到了skip加limit的分页方式,使得性能变慢

所以通过讨论使用了一下措施.即要求2

2)最多分5000页,(其实用户也不可能从第一页一页一页的翻到6000页去,一般情况下翻个几十页,查不到自己所要的数据,都会重新输入查询条件来再进行一次筛选)

 

经过前面的博客讨论,可以知道分页过程中用cursor.count()获取符合条件的条数是很耗时的,在几千万条数据的压力下,基本上点击查询等待时间不是一般的慢.

 

结合要求2,现在我们的分页思路可以进行一下改动,思路的伪代码如下

1)分页查询语句为:

   

DBCursor cursor = collection.find(query).skip((currentPage-1) * PAGESIZE).sort(new BasicDBObject("starttime", -1)).limit(PAGESIZE);//PAGESIZE=10

2)既然限制了最大页数,那么可以知道skip的最大值就等于最大页数*每页显示的条数,在这里是10*5000=50000条.那么核心思路也就由此而出

 

int  count = 0;

if(查询的数量>50000){

  count = 5000;

}else{

   count =实际的数量

}

通过if条件可知,我们需要做这么一个判断:判断符合条件的数据量的大小是否大于50000

所以,在分页查询语句的后面可以添加这样的一句代码

 

DBCursor cursor2 = collection.find(query).skip(maxPage * PAGESIZE).limit(1);//maxPage=最大页数,在这里是5000

这句代码思路很简单,就只直接skip跳过50000条数据进行查询,如果能查到结果,就说明查询的数据量大于50000条

所以上面的代码改动如下

int count = 0;

if(cursor2.hasNext()){//说明数据量大于50000

   count = 50000;

}else{

   count = cursor.count();//在五万条数据以内的情况下,这个速度还是挺快的

}

当然上面的语句也可以写的更优雅一些

int count = cursor2.hasNext()? 50000:cursor.count();

方法有点:

多增加了一条查询语句,进行最大条数的判断,虽然说查询语句增加了,但是结果显示查询效率确实有了很大的提高,因为这些查询通过测试都是毫秒级的.易用性得到提高

方法缺点:

  限制了分页的最大页数,使得查询结果显示的不全,一定程序上影响了用户的使用.







以上是关于MongoDB随笔的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 查询文档随笔

mongodb基础随笔

MongoDB随笔

年末小随笔

mongodb 降序

MongoDB PHP