一、分页查询
- 通过sort、limit、skip三个集合自带方法的配合,可以实现分页效果
var C //每页条数
var N //第几页
var pageN=db.collection.find().skip((N-1)*C).limit(C).sort();
- 上面的分页查询方法使用了skip函数,skip函数在跳过较少文档时,速度还可以,但是当跳过的文档数较多时速度就会明显降低。此时可以考虑配合_id或者某个可以做比较的字段来进行分页,以提高效率
var C; //每页条数
var latest;
//第一页:
var page1=db.collection.find().sort({"_id":1}).limit(C);
while(page1.haseNext()){
...latest=page1.next();...display(latest);
...}
var page2=db.collection.find({"_id":{"$gt":latest._id}});
page2.sort({"_id":1}).limit(C);
//... 以此类推获取pageN
二、随机抽取文档
- 通过Math对象中的方法,配合skip函数可以实现随机抽取文档的功能
var total=db.collection.count();
var random=Math.floor(Math.random()*total);
db.collection.find().skip(random).limit(1);
- 在设计的时候可以将一个集合设计为可随机抽取的集合,只要在其中添加一个可比较的字段如数字,然后就可以来进行查询获取随机文档
db.collection.findOne({"random":Math.random()});
db.collection.findOne({"random":{"$gt":Math.random()}});
三、分组查询
- 使用集合内置的group方法进行分组查询
db.collection.group({
...key:{age:true},//分组依据的字段,
...initial:{num:0},//分组器的初始状态,
...$reduce:function(doc,prev){prev.num++;},//累加器,为每一个分组的分每一个对象进行操作,系统会为自定义函数提供两个参数:doc当前文档,prev分组中的前一个文档
...condition:{age:{$gt:2}}//过滤条件, 可使用$where操作符和js自定义函数来提供条件如下
//...condition:{$where:function(){return this.age>2;}},
...finalize:function(doc){doc.count=doc.num; delete doc.num;},//完成器,在当前文档被遍历之后执行,用来精简数据
});
四、游标
- 游标可以让用户对查询的结果进行很多控制
var cursor=db.collection.find();
while(cursor.hasNext()){
...printjson(cursor.next());
...}
- 游标实现了iterator接口,因此可以进行forEach循环
var cursor=db.collection.find();
cursor.forEach(function(obj){
...print(obj.x);
...})
- 当find方法调用时,shell并不会立即查询数据库,而是等到真正请求结果的时候才会执行查询,这样可以在实际执行查询之前追加一些其他的选项
- 游标的方法基本上都返回游标本身,所以可以按任意顺序调用方法,所以以下三个方法完全等效
var cursor=db.test.find().sort({"x":1}).limit(1).skip(10);
var cursor=db.test.find().limit(1).sort({"x":1}).skip(10);
var cursor=db.test.find().skip(10).limit(1).sort({"x":1});
- 但是以上方法都并没有执行查询,真正执行查询的方法是hasNext,执行查询时会查询前100条或4MB的结果。
cursor.hasNext();
五、存储过程
- mongodb中的存储过程就是js函数,因此它强大到爆表
- 所有的存储过程都保存在db.system.js文档中
- 查看当前数据库中的存储过程
db.system.js.find();
- 添加新的存储过程
db.system.js.save({
..."_id":"addNum"},
...value:function(x,y){return x+y;}
...})
- 调用存储过程
db.eval("addNum(6,5.2)");
db.eval("function(){return 1+1;}");
本文主要介绍了mongodb的高级查询