这里主要是讲MongoDB在控制台中如何进行高级查询。

还有一句想提醒大家,多动手实验,才是硬道理。

<,>,>=,<=

这四个就不用解释了,最常用的,也是最简单的。

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

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

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

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

如果要同时满足多个条件,记得要这样用:

db.collection.find({ "field" : { $gt: value1, $lt: value2 } } )    // value1 < field < value

$ne   不等于

db.things.find( { x : { $ne : 3 } } )

条件相当于x<>3,x不等于3

$mod    取模运算

db.things.find( { a : { $mod : [ 10 , 1 ] } } )

条件相当于a % 10 == 1 a除以10余数为1的。

$nin  不属于

db.things.find({j:{$nin: [2,4,6]}})

条件相当于 不等于 [2,4,6] 中的任何一个。

$in     属于

db.things.find({j:{$in: [2,4,6]}})

条件相当于j等于[2,4,6]中的任何一个。

$all  全部属于

db.things.find( { a: { $all: [ 2, 3 ] } } )

$in类似,但必须是[]的值全部都存在。

$size     数量,尺寸

db.things.find( { a : { $size: 1 } } )

条件相当于a的值的数量是1a必须是数组,一个值的情况不能算是数量为1的数组)。

$exists   字段存在

db.things.find( { a : { $exists : true } } )

db.things.find( { a : { $exists : false } } )

true返回存在字段a的数据,false返回不存在字度a的数据。

$type     字段类型

db.things.find( { a : { $type : 2 } } )

条件是a类型符合的话返回数据。

参数类型如下图:

 

Type Name

Type Number

Double

1

String

2

Object

3

Array

4

Binary data

5

Object id

7

Boolean

8

Date

9

Null

10

Regular expression

11

JavaScript code

13

Symbol

14

JavaScript code with scope

15

32-bit integer

16

Timestamp

17

64-bit integer

18

Min key

255

Max key

127

Regular Expressions    正则表达式

db.customers.find( { name : /acme.*corp/i } )

类似sql中的like方法。

 

行开始 /^ 行结束 $/

 

这里要特别特别特别地注意一点,关乎查询效率:

While /^a/, /^a./, and /^a.$/ are equivalent and will all use an index in the same way, the later two require scanning the whole string so they will be slower. The first format can stop scanning after the prefix is matched.

意思大概就是指在查询以a开头字符串时,可以有三种形式, /^a/, /^a./,/^a.$/ 。后面两种形式会扫描整个字符串,查询速度会变慢。第一种形式会在查到符合的开头后停止扫描后面的字符。

 

所以要特别注意。

 

几个附加参数:

 

i的意思是忽略大小写。(这个很重要,很常用)

m的意思是支持多行。(不过ME没有尝试过)

x的意思是扩展。(也没用过)

$or  或 (注意:MongoDB 1.5.3后版本可用)

db.foo.find( { $or : [ { a : 1 } , { b : 2 } ] } )

符合条件a=1的或者符合条件b=2的数据都会查询出来。

 

与其他字段一起查询:

db.foo.find( { name : "bob" , $or : [ { a : 1 } , { b : 2 } ] } )

符合条件name等于bob,同时符合其他两个条件中任意一个的数据。

Value in an Array   数组中的值

 

例如数据库中存在这样的数据:

{ "_id" : ObjectId("4c503405645fa23b31e11631"), "colors" : [ "red", "black" ] }

查询

db.things.find( { colors : "red" } );

即可查到上面那条数据。

$elemMatch   要素符合

t.find( { x : { $elemMatch : { a : 1, b : { $gt : 1 } } } } )

结果:

{ "_id" : ObjectId("4b5783300334000000000aa9"),

"x" : [ { "a" : 1, "b" : 3 }, 7, { "b" : 99 }, { "a" : 11 } ]

}

x其中一个要素符合那个检索条件就可以被检索出来。(不过一般谁用像x这样的结构去保存数据呢?)

Value in an Embedded Object    内嵌对象中的值

例如数据库中存在这样的数据:

{ "_id" : ObjectId("4c503773645fa23b31e11632"), "author" : { "name" : "Dan Brown", "age" : 38 }, "book" : "The Lost Symbol" }

查询:

db.postings.find( { "author.name" : "Dan Brown" } );

即可查到上面那条数据。

查询内嵌对象的属性,记得要加上“”,字段是author.name,而不是author.name

$not 不是

db.customers.find( { name : { $not : /acme.*corp/i } } );

这是一个与其他查询条件组合使用的操作符,不会单独使用。

只要你理解了前面的查询操作即可,只是再加上了$not,结果就是得到了没有$not的相反结果集。

sort()    排序

这个非常实用。即sql语言中的OrderBy。

db.myCollection.find().sort( { ts : -1 } )

也可以多个字段排序

db.myCollection.find().sort( { ts : -1 ,ds : 1 } )

这里的1代表升序,-1代表降序。

经过ME的实验,小于0的数字就是降序,0以上(包括0)就是升序。

limit()   skip()

这两个ME想连起来讲,他们就是你实现数据库分页的好帮手

limit()控制返回结果数量,如果参数是0,则当作没有约束,limit()将不起作用。

skip()控制返回结果跳过多少数量,如果参数是0,则当作没有约束,skip()将不起作用,或者说跳过了0条。

例如:

db.test.find().skip(5).limit(5)

结果就是取第6条到第10条数据。

snapshot()   (没有尝试)

count()   条数

返回结果集的条数。

db.test.count()

在加入skip()和limit()这两个操作时,要获得实际返回的结果数,需要一个参数true,否则返回的是符合查询条件的结果总数。

例子如下:

> db.test.find().skip(5).limit(5).count()

9

> db.test.find().skip(5).limit(5).count(true)

4

Mongo查询的更多相关文章

  1. Mongo 查询

    Mongo 查询   mongo js 遍历 db.getCollection('CPU').find({}).limit(100).sort({"time":-1}).forEa ...

  2. Mongo查询百万级数据性能问题及JAVA优化问题

    Mongo查询百万级数据  使用分页  skip和limit 效率会相当慢   那么怎么解决呢  上代码 全部查询数据也会特别慢 Criteria criteria = new Criteria(); ...

  3. 一次mongo查询不存在字段引发的事故

    话说今天的一个小小的查询失误给了我比较深刻的教训,也让我对mongo有了更深刻的理解,下面我们来说说这个事情的原委: 我们经常使用阿里云子账号在DMS上查询线上数据库数据,今天也是平常的一次操作 集合 ...

  4. 整理最近用的Mongo查询语句

    背景 最近做了几个规则逻辑.用到mongo查询比较多,就是查询交易信息跑既定规则筛选出交易商户,使用聚合管道进行统计和取出简单处理后的数据,用SQL代替业务代码逻辑的判断. 方法 MongoDB聚合使 ...

  5. 在shell 上执行mongo 查询

    需求 在写小工具的时候,经常遇到需要从mongodb 里面查东西来用,因为要跟其他bash 工具链结合在一起用,所以最理想的方法是能够在shell 上执行查询,然后pipe 给接下来的工具做处理. 方 ...

  6. laraver mongo 查询操作

    1,mongo 不支持特殊where条件(&,|) 2,mongo 可以连接mysql的表查询,但不支持连表的where查询

  7. mongo查询日期格式数据

    /ali/mongodb/bin/mongo -u user -p '123456' 127.0.0.1:27017/KYElog ISODate方式 db.col_02.find({"Lo ...

  8. mongo 查询 距离 某个点 多少 米距离 感谢 提供的数据。 感谢 mvc的 demo 。反正 就是各种感谢 文档之类的。

    昨天 去面试来着, 问了一下mong . 我记得mong支持 地理位置索引的,说了一下. 然后 面试官说 查询某个点 的 多少米范围, 这个该怎么实现? 我懵逼了.... 回去 查询了一下. 发现有 ...

  9. Mongo查询list数组中一个字段大于特定条数

    由于刚刚接触mongodb,很多语法还不是很了解,写的不好的地方请大佬指出 查询的demo数据 { "_id":Object("xxxxxxxx"), &quo ...

  10. 如何将mongo查询结果导出到文件中

    1.新建一个js文件,将查询方法写进去,如dump.js,文件内容如下 var c = db.campaign.find({status:1}).limit(5) while(c.hasNext()) ...

随机推荐

  1. H5+Mui文件配置 vue-resource基本使用方法

    使用HBuilder空项目搭建h5原生开发框架需要的文件配置: *css:mui.min.css *fonts:mui.ttf mui-icon-extra.ttf *js:mui.js mui.mi ...

  2. java的英文词频算法

    java实现的英文词频算法,通常是采用单词树来实现的.使用java实现词频统计,为了统计词汇出现频率,最简单的做法是再建立一个map,其中,key是单词,value代表次数.将文章从头读到尾,读到一个 ...

  3. 一篇关于匿名函数(function(){})()不错的文章

    代码如下: (function(){ //这里忽略jQuery所有实现 })(); (function(){ //这里忽略jQuery所有实现 })(); 半年前初次接触jQuery的时候,我也像其他 ...

  4. 关于Node.js的总结

    Node是个啥? 1.Node 是一个服务器端 JavaScript 解释器,可是真的以为JavaScript不错的同学学习Node就能轻松拿下,那么你就错了,总结:水深不深我还不知道,不过确实不浅. ...

  5. ios 定位

    ios 定位新功能----在程序中实现定位功能 Core Location是iOS SDK中一个提供设备位置的框架.可以使用三种技术来获取位置:GPS.蜂窝或WiFi.在这些技术中,GPS最为精准,如 ...

  6. HDFS 异常处理与恢复

    在前面的文章 <HDFS DataNode 设计实现解析>中我们对文件操作进行了描述,但并未展开讲述其中涉及的异常错误处理与恢复机制.本文将深入探讨 HDFS 文件操作涉及的错误处理与恢复 ...

  7. Visual Studio 2015 CTP6 发布

    微软发布ASP.NET 5 支持在Windows.Mac和Linux上构建程序,Visual Studio 2015 CTP6(社区预览版)现已发布了.感兴趣的朋友们可以登录官网下载[http://w ...

  8. .NET中那些所谓的新语法之三:系统预定义委托与Lambda表达式

    开篇:在上一篇中,我们了解了匿名类.匿名方法与扩展方法等所谓的新语法,这一篇我们继续征程,看看系统预定义委托(Action/Func/Predicate)和超爱的Lambda表达式.为了方便码农们,. ...

  9. 使用VS+VisualGDB编译调试Linux程序

    Linux程序开发变得越来越多,越来越多的程序.产品需要跨平台,甚至有些开源项目只支持Linux平台,所以掌握Linux开发变得越来越重要. 但是对于习惯了Windows下的开发,使用了VS这个宇宙第 ...

  10. 用Powershell启用Windows Azure上的远程桌面服务

    [题外话] 某天不小心点了XX管家的自动修复,虽然及时点了取消也看到了远程桌面服务成功被关闭,但是忙完该干的事以后竟然忘记了这件事,在断开远程桌面服务之前也忘记再次打开.以至于之后几天一直以为Azur ...