MongoDB 查询语句示例

MongoDB支持的查询语言非常强大,语法规则类似于面向对象的查询语言,可以实现类似关系数据库单表查询的绝大部分功能,并且由于MongoDB可以支持复杂的数据结构,不受二维表形式的限制,因此MongoDB的查询速度非常快。下面介绍一些MongoDB的高级查询语法。

1、条件操作符查询

所谓条件操作符,就是< 、<=、>、>=这些符号,相应的查询语法如下:

db.collection.find({"key":{$gt:value}});  //大于  key>value

db.collection.find({"key":{$gte:value}});  //大于等于  key>=value

db.collection.find({"key":{$lt:value}});  //小于  key<value

db.collection.find({"key":{$lte:value}});  //小于等于  key<=value

上面的collection是一个集合名。key是要查询的字段,value是比较的范围。SQL为:select * from collection where key > (或者>=,<,<=)value,

2、$all匹配所有的值

这个操作与SQL语法的in类似,但是in只需要满足范围之一的值就可以,但是$all必须满足所有的值。例如

db.collection.find({age:{$all:[20,21]}});

可以查询出来 {age:[20,21,22]} 但是查询不出来 {age:[20,22,23]},即一定要有20和21.

3、$in查询包含的值

这个与$all不一样,查询的值在$in给出的范围之内就都可以查出来。例如

db.collection.find({age:{$in:[20,21]}});

可以查询出来 {age:[20,21,22]}{age:[20,22,23]} 以及 {age:[21,22,23]},即只需要有20或者21其中之一的都可以。

4、$exists判断字段是否存在

可以用$exists判断某一字段是否存在,例如查询存在age字段的记录

db.collection.find({age:{$exists:true}});

查询不存在age字段的记录

db.collection.find({age:{$exists:false}});

5、null值的处理

null值处理需要注意的是,不仅仅可以查询出来某一字段值为null的记录,还可以查出来不存在某一字段的记录。例如

db.collection.find({age:null})

可以查询出来age为null的记录,以及没有age字段的记录。如果我们需要只去查询存在age字段并且age字段的值为null的记录,需要配合exists操作,例如

db.collection.find({age:{"$in":[null],"$exists":true}});

即查询存在age字段的并且age字段值为null的记录

6、$mod取模运算

这个操作可以进行模运算。例如,查询age取模5等于3的记录

db.collection.find({age:{$mod:[5,3]}});

7、$ne不等于操作

可以查询不等于某一字段的数据,例如,查询age不等于20的记录

db.collection.find({age:{$ne:20}});

8、$nin不包含操作

这个与$in相反,查询不包含某一字段的记录,例如查询age不等于20,21,22的记录

db.collection.find({age:{$nin:[20,21,22]}});

9、count查询记录条数

这个可以用来知道查询到记录的条数,例如查询age等于20的记录数目

db.collection.find({age:20}).count();

10、排序

用sort函数排序,例如按照age升序排列

db.collection.find().sort({age:1})

类似asc,

按照age降序排列

db.collection.find().sort({age:-1})

类似desc。同时也可以在find里面添加查询条件。

11、skip和limit语句

这个是用来跳过几条记录然后查询指定数目的记录,例如跳过3条记录查询其余记录的最前面5条,

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

find里面可以加条件,这个类似SQL:select * from collection limit(3,5)

12、JavaScript查询和$where查询

例如,查询age大于20的记录,可以分别用到如下的方式:

db.collection.find({age:{$gt:20}});

这是条件操作符方式,

db.collection.find({$where:"this.age > 3"});

这是$where方式,

db.collection.find("this.age > 3");

这是内部对象查询

func=function(){return this.age > 3;} db.collection.find(func)

这是JavaScript方式。这几种方式都是一样的效果。

13,存储过程

MongoDB也可以有存储过程。例如一个简单的SQL存储过程函数为

function addNum(x,y){

return x+y;}

现在要将这个函数转化成MongoDB的存储过程。Mongo的存储过程是保存在db.system.js表中的,可以这么写

db.system.js.save({_id:"addNum",value:function(x,y){return x+y;}});

这样就创建了一个存储过程。我们可以对存储过程进行查看、修改和删除操作,例如查看所有的存储过程,

db.system.js.find()

,其余修改和删除类似对记录的操作。

调用创建好的存储过程,需要用到db.eval(),例如调用刚刚创建的addNum,是这样

db.eval("addNum(30,12)");

就可以得出答案是42。

同时,可以直接使用db.eval来创建存储过程并且直接调用,例如

db.eval(function(){return 30+12;});

可以直接得出42,这样可以知道使用db.eval可以直接进行算数运算,非常方便。

还有就是,存储过程可以处理数据库内部的操作,例如

db.system.js.save({_id:"getCount",value:function(){return db.collection.find({age:20}).count();}});

可以将db.collection中age为20的记录数目保存在getCount这个存储过程中,调用的时候这样

db.eval("getCount()");

就可以直接取得那个数目。

About 智足者富

http://chenpeng.info

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>