当前位置: 传客网 > MongoDB高级查询语句

MongoDB高级查询语句

2016-12-27 作者:libo利博

本文介绍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"key":{$lte:value}});  //小于等于  key<=value
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

2、$all匹配所有的值

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

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

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

3、$in查询包含的值

这个与in给出的范围之内就都可以查出来。例如

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

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

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

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

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

查询不存在age字段的记录

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

5、null值的处理

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

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

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

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

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

6、$mod取模运算

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

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

7、$ne不等于操作

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

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

8、$nin不包含操作

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

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

9、count查询记录条数

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

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

10、排序

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

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

类似asc,

按照age降序排列

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

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

11、skip和limit语句

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

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

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

12、JavaScript查询和$where查询

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

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

这是条件操作符方式,

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

这是$where方式

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

这是内部对象查询

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

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

13,存储过程

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

function addNum(x,y){

return x+y;}
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

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

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

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

db.system.js.find()
  • 1
  • 1

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

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

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

就可以得出答案是42。

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

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

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

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

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

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

db.eval("getCount()");
  • 1
  • 1

就可以直接取得那个数目。
14,数组查询
“$size”用来查询数组的长度.例如查找fav长度为2的文档:

> db.test3.find({"fav":{"$size":2}})
{ "_id" : ObjectId("573e8b719e178b5475b29d91"), "name" : "tom", "fav" : [ "chess", "cooking" ] }
  • 1
  • 2
  • 1
  • 2

slice操作符

find的第二个参数返回指定的键.这个特别的”$slice”操作符可以返回某个键匹配的数组元素的一个子集.
例如我想返回前2个fav的值:

> db.test3.findOne({"name":"brent"},{"fav":{"$slice":2}})
{
    "_id" : ObjectId("573e874c9e178b5475b29d8e"),
    "name" : "brent",
    "fav" : [
        "game",
        "film"
    ]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

如果想要返回后2个的值,就写-2就可以了.
“$slice”也可以指定偏移量和返回的元素数量,例如:

> db.test3.findOne({"name":"brent"},{"fav":{"$slice":[1,2]}})
{
    "_id" : ObjectId("573e874c9e178b5475b29d8e"),
    "name" : "brent",
    "fav" : [
        "film",
        "read"
    ]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这表示跳过前面1个,从第二个开始返回两个元素,如果元素不够则返回所有的元素.
除非特别声明,否则使用”$slice”将返回文档中的全部键.
返回一个匹配的数组元素

如果知道元素的下标,那么”操作符 .
例如下面得到name为bob的,并且显示任意一个评论:

> db.test4.findOne()
{
    "_id" : ObjectId("573f390c9e178b5475b29d92"),
    "name" : "brent",
    "comment" : [
        {
            "name" : "bob",
            "content" : "good"
        },
        {
            "name" : "jack",
            "content" : "repost"
        }
    ]
}
> db.test4.find({"comment.name":"bob"},{"comment.$":1})
{ "_id" : ObjectId("573f390c9e178b5475b29d92"), "comment" : [ { "name" : "bob", "content" : "good" } ] }

详情:http://blog.csdn.net/lydiacheung/article/details/52668593


相关推荐

  • sql语句查询问题

    sql关联查询,只有当后面查询语句加入查询项时,前面的查询语句才能查询该项

  • SQL语句查询字段中是否包含汉字

    一:查询字段首位是否为汉字?SELECT*FROM表名WHEREascii(字段)>127二:查询字段是否包含汉字(任意位)?select*from表名where字段like'%[吖-座]%'--这个可以判断是否包含汉字而不是其它双字

  • mysql中优化sql语句查询的30种方法

    mysql中优化sql语句查询的30种方法:1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及orderby涉及的列上建立索引。2.应尽量避免在where子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表

  • sql语句查询当日、一周、一月的数据

    详细说明sql语句查询当日、一周、一月的数据的方法select*fromShopOrderwheredatediff(week,ordTime,getdate()-1)=0//查询当天日期在一周年的数据select*fromShopOrde

  • 浅谈MySQL中优化sql语句查询常用的30种方法

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及orderby涉及的列上建立索引。2.应尽量避免在where子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。3.应尽量避免在where子句中对字段

  • sql语句查询Oracle|sql server|access 数据库里的所有表名,字段名

    Oracleselect*fromuser_tableswheretable_name='用户名'如果是用该用户登录使用以下语句:SELECT*FROMUSER_TABLES;如果是用其他用户:SELECT*FROMALL_TABLESWH

  • SQL查询语句 全集

    SQL查询语句全集一、简单查询简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。例如,下面的语句查询testtable表中姓名为“张三”的nickname字

  • mongodb慢查询记录(耗时查询的日志记录)

    http://blog.sina.com.cn/s/blog_5f53615f0101448f.html在MySQL中,慢查询日志是经常作为我们优化数据库的依据,那在MongoDB中是否有类似的功能呢?答案是肯定的,那就是MongoData

  • SQL查询语句大全集锦

    一、简单查询简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段

  • Java教程—Hibernate、hql语句和QBC查询

    通过上面HQL语句我们可以看出,这时查询出来的就是一个个student对象了,而不是一个个游离的数据了,这里一定要注意HQL语句的写法。这种写法在sql语句中肯定是不支持的。java教程HQL语句进行内连接查询:fromTeamtjoint

  • 优化SQL查询:如何写出高性能SQL语句

    1、首先要搞明白什么叫执行计划?执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个10万条记录的表中查1条记录,那查询优化器会选择“索引查找”方式,如果

  • Oracle分页查询语句

    Oracle分页查询语句(一)Oracle分页查询语句(一)===========================================================作者:yangtingkun([url]http://yang

  • SQL语句提高查询性能的关键[zz]

    SQL结构化查询字符串的改写,是实现数据库查询性能提升的最现实、最有效的手段,有时甚至是唯一的手段,比如在不允许大幅度修改现有数据库结构的情况下。通过优化SQL语句提高查询性能的关键是:根据实际需求情况,建立合适的索引;&#

  • 常用SQL查询语句

    一、简单查询语句1.查看表结构SQL>DESCemp;2.查询所有列SQL>SELECT*FROMemp;3.查询指定列SQL>SELECTempmo,ename,mgrFROMemp;SQL>SELECTDISTI

  • 第一章 oracle简单查询语句

    1.1基本查询语句SQL(structurequerylanguage)DMLdatamanipulationlanguageDDLdatadefinitionlanguageDCLdatacontrollanguage语法:select[

  • ABAP 数据查询语句SELECT

    c通常使用OpenSQL的数据查询语句SELECT将数据库条目选择到内存。一.SELECT语句:1)SELECT用于确定读取数据表中的哪些字段;2)FROM子句用于确定从哪些内表或者视图中读取数据;3)INTO用于确定将数据读取到程序内的哪

  • 数据库分页查询语句1

    JAVA程序调用SQL查询语句,传参有两个变量,起始行参数为startRow,每页显示行数的参数为pageSize求分别在sqlserver和oracle的查询写法形式如MySql中的写法:("select*fromcitys"+"limi

  • 经典SQL查询语句大全

    一、基础1、说明:创建数据库CREATEDATABASEdatabase-name2、说明:删除数据库dropdatabasedbname3、说明:备份sqlserver---创建备份数据的deviceUSEmasterEXECsp_add

  • mybatise模糊查询拼接语句

    假如你有一个list数组名字叫testList,里面的数据例如{"a","b"},然后你项目需要你以这两个元素进行模糊查询,那么你可以这样做。假如你的sql语句是想写成这样:select*fromtableAtawhereta.alike"

  • 2016高考英语写作高级句型25例,超好用!

    教育,文艺,时尚2016高考英语写作高级句型25例,超好用!能够写出写对好的句型,英语作文就成功了一大半。下面这25个写作句型非常实用,也非常好用,建议同学们一定要背下来!1.Itgoeswithoutsayingthat......=It

返回
顶部