MongoDB(四) 语法(高级查询)

本文深入探讨MongoDB的高级查询技术,包括分页查询、随机抽取文档、分组查询、游标控制及存储过程的使用,旨在提升数据库操作效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、分页查询

  • 通过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的高级查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值