用skip略过少量的文档还是不错的。但是要是数量非常多的话,skip就会变得很慢,因为要先找到需要被略过的数据,然后再抛弃这些数据。大多数数据库都会在索引中保存更多的元数据,用于处理skip,

但是mongoDB目前还不支持,所以要尽量避免略过太多的数据 。通常可以利用上次的结果来计算下一次的查询条件。

最简单的分页方法就是用limit返回结果的第一页,然后将每个后续页面作为相对开始的偏移量返回。

比如var page1=db.Log.find(query).skip(100).limit(100)

然而,一般来讲可以找到一种不使用skip的情况下实现分页,这取决于查询的本身。例如。要按照时间降序显示文档列表。可以用如下方式获取结果的第一页

var page1=db.Log.find().sort({"createtime":-1}).limit(100)

然后可以利用最后一个文档中的createTime的值最为查询条件,来获取下一页

var lasttime=null;

while(page1.hasnext()){

lasttime=page1.next();

}

var page2=db.Log.find({"createtime":{"$gt":createtime.createtime});

page2.sort({"createtime":-1}).limit(100);

那么在c#中我觉得大概应该就是这么实现,当然了这只是个演示,肯定是不能在这个函数中查询上次的结果的,不然又再次查询了,直接把上次查询结果传过来就好‘

 public static List<Log> GetList(IMongoQuery query, int pagesize, int pagenum, DateTime lasttime)
{
MongoDatabase db = MongoHelperFactory.GetDataBase();
MongoCollection collection = db.GetCollection<Log>("Log"); return collection.FindAs<Log>(query).Where(l => l.CreateTime < lasttime).OrderByDescending(l => l.CreateTime).Take(pagesize).ToList(); }

调用方法是这样的

 int SkipNum = Convert.ToInt32(Request.Form["page"]) - ;
int TakeNum = Convert.ToInt32(Request.Form["rows"]);
string searchstr = "";// Request.QueryString["condition"]; IMongoQuery query = null;
if (Request.QueryString["condition"] != null)
{
searchstr = Request.QueryString["condition"];
query = Query<Log>.Matches(c => c.Description, new BsonRegularExpression(new Regex(searchstr)));
}
// List<Log> list = DAL.DALLog.GetList(query).OrderByDescending(l => l.CreateTime).ToList() ; // return Content("{\"total\":\""+list.Count()+"\",\"rows\":"+ users.Take(TakeNum).Skip(TakeNum*SkipNum).ToJson().ToString()+"}");
StringBuilder sb = new StringBuilder();
sb.Append("{\"total\":\"" + DAL.DALLog.GetCount(query) + "\",\"rows\":["); List<Log> list = DAL.DALLog.GetList(query, TakeNum, SkipNum, (Session["lastLog"] as Log));
Session["lastLog"] = list.OrderBy(l => l.CreateTime).First();

c#开发Mongo笔记第九篇的更多相关文章

  1. c#开发Mongo笔记第二篇

    写到第二篇不得不说是我之前犯了一个小错误,其实实现子表存储也是很简单的事,先说我想实现什么样的效果吧 就是用户表里有个成绩字段,成绩字段是个子表 其实实现这个功能也很简单,用面向对象的思想很好理解,子 ...

  2. c#开发Mongo笔记第一篇

    现在开发的这个项目要用mongo数据库开发,发现网上的这方面教程还是比较少的,只能边看官方说明边进行开发,再开发过程中写下笔记,也算上是一个总结吧. 我开发使用的是vs2013了,驱动用的是最新的1. ...

  3. c#开发Mongo笔记第八篇

    到今天为止,Mongo开发的权限管理系统功能就做完了,剩下的就是完善构架,优化结构,只是现在c#操作Mongo的各种操作基本都掌握了 说到权限管理系统,其实再简单不过了,在关系型数据的是时代,我们通常 ...

  4. c#开发Mongo笔记第六篇

    之前写的五篇比较得到了大家的积极反馈,也有个别高手对我写我写出的代码进行了指教. 其中提到的我写的查询方法性能有问题,我想了想,如果mongo不是延时加载的话,那我的查询就真的有问题了,就成了查询出来 ...

  5. c#开发Mongo笔记第四篇

    今天是个伟大的日子,不得不说小苹果的歌词真是深入人心啊. 不过今天伟大并不是因为我种下一颗种子,而是我从今天不再写demo,而是进入项目的正式开发当中,毕竟项目时间有限(想必各位码农也都深有体会吧), ...

  6. c#开发Mongo笔记第七篇

    开发到这里遇到了一些问题,哪到这里想请教一下大家 今天我完成的是菜单功能, public class Menu { public ObjectId _id { get; set; } public i ...

  7. c#开发Mongo笔记第三篇

    今天主要测试了一下查询功能了,当然了主要还是为了让查询可以和我们平时使用的实体对象关联起来,并且 那些BsonDocument和Collection我们操作起来不是太方便的 还是首先定义了一个用户类, ...

  8. c#开发Mongo笔记第五篇

    现在增删查改算是都完成了,但是查询算是有点不完美的,相信现在用juqeryeasyui这一类的插件的人应该也不少吧,这样的话前台展示需要JSON格式的数据, 好在mogno驱动提供toJson()的函 ...

  9. MyCat 学习笔记 第九篇.数据分片 之 数值分布

    1 应用场景 Mycat 自带了多套数据分片的机制,其实根据数值分片也是比较简单,其实这个和数据取摸是类似的实现. 优.缺点同上一篇 2 环境说明 参考  <MyCat 学习笔记>第六篇. ...

随机推荐

  1. 黄聪:PHP页面跳转如何实现延时跳转

    php在用header重定向的时候,可以设置下延时跳转,代码如下: header("Refresh:5;url=index.php");

  2. js 生成 yyyy-mm-dd 格式的逼格姿势

    关于 js 生成 yyyy-mm-dd 格式,往往都会采取手动拼接,一般不愿意为了小功能而去动用 momentjs 之类的插件. ps: 只分享简单方法,网上有 N 多 dateformat 代码,这 ...

  3. elastic search 配置问题

    http://www.elastic.co/guide/en/elasticsearch/guide/current/hardware.html 此处有关于ES硬件规格的建议和各种推荐参数. 内存: ...

  4. InnoDB: Error number 24 means ‘Too many open files’.--转载

    一.问题的描述 备份程序 执行前滚的时候报错.(-apply-log) InnoDB: Errornumber 24 means 'Too many open files'. InnoDB: Some ...

  5. 关于oracle中to_char和to_date的用法

      一.24小时的形式显示出来要用HH24 select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual; select to_date('200 ...

  6. MBW内存测试

    在测试前,理应了解本机所具备的特点,比如CPU频率.内存频率.内存大小,等等信息. 查看CPU用如下命令(多少个核,频率,特性等): cat /proc/cpuinfo 查看内存用如下命令:(只有当前 ...

  7. Asp.net 怎样去除表单多行文本框滚动条

    <textarea style="overflow:hidden;border-width:0px;">永远没有滚动条</textarea><text ...

  8. 更改form字段内容颜色

    1.fnd_global.Newline ---换行2.设置栏位值颜色:POST-QUERY SET_ITEM_INSTANCE_PROPERTY('FIND_RESULT.STATUS',CURRE ...

  9. Mybatis保存数据时事务问题

    今天不小心在sqlplus中用for update ,然后事务没提交,结果在项目中一直保存不进去数据,找了很久发现是sqlplus中的事务没提交,哎,这种问题真得避免啊,一定要细心啊!

  10. Jvm支持的最大线程数

    摘自 http://blog.csdn.net/xyls12345/article/details/26482387 JVM最大线程数 (2012-07-04 23:20:15) 转载▼ 标签: jv ...