一、概述

mongodb是最接近关系型数据库的NOSQL数据库,它的存储方式非常的灵活;以至于你会将它看成是一个经过冗余过的关系型数据库的表,这也是Mongodb原子性的一个特征。由于没有关系型数据库的表之间的关联关系和事务性所以Mongodb插入和更新的效率非常的高,同时也支持索引。我们在查询的时候不能带着关系型数据库的思维,可以简单的把集合看成是关系型数据库的表、文档看成是行、键看成是字段;但是Mongodb的键可以是数组也可以是文档这又像是支持xml类型的关系型数据库的字段。

版本:3.4.10

插入测试数据

db.test.insert(
[
{name:"short sleeve",
type:,
size:["S","M","L"],
buyer:{ name:"chen", city:"guangzhou" },
saleDetial:[{dates:ISODate("2012-11-02"),price:,sales:},
{dates:ISODate("2012-11-03"),price:,sales:},
{dates:ISODate("2012-11-04"),price:,sales:}
]
},
{name:"coat",
type:,
size:["M","L"],
buyer:{name:"zhang", city:"shanghai"},
saleDetial:[{dates:ISODate("2012-11-02"),price:,sales:},
{dates:ISODate("2012-11-03"),price:,sales:},
{dates:ISODate("2012-11-04"),price:,sales:}
]
},
{name:"fleece",
type:,
size:["S","M","L"],
buyer:{name:"wang", city:"shenzhen"},
saleDetial:[{dates:ISODate("2012-11-02"),price:,sales:},
{dates:ISODate("2012-11-03"),price:,sales:},
{dates:ISODate("2012-11-04"),price:,sales:}
]
}
]
)

二、简单查询

显示DB:
show dbs
显示集合:
show tables

1.简单键

db.collection.findOne()

仅仅返回单个文档,相当于使用limit

只查询name,type列;相当于select name,type from test

db.test.find(
{},
{"_id":,"name":,"type":}
)

查询名称等于“coat”的数据

db.test.find(
{name:"coat"},
{"_id":,"name":,"type":}
)

2.文档嵌套数组

注意:数组的下标从0开始

1.查询size数组的第一个元素等于M的记录

db.test.find(
{"size.0":"M"}
)

2.查询size数组保护M的记录

db.test.find(
{"size":"M"}
)

3.文档嵌套文档

查询键buyer内嵌文档键name等于“chen”的文档

db.test.find(
{"buyer.name":"chen"}---列出文档内的元素的方法
)
或者
db.test.find(
{"buyer":{"name":"chen", "city":"guangzhou"}}
)

注意:如果使用完整的文档嵌套文档的查询方法,那么内嵌文档中的所有键值都要列出来匹配

4.文档嵌套数组嵌套文档

1.查询数组中的文档键等于

db.test.find(
{"saleDetial.price":""}
)

2.查询数组中第二个元素的文档键等于

db.test.find(
{"saleDetial.1.price":""},
{"_id":,"name":,"type":,"saleDetial.price":}
)

三、运算符

1.比较运算符

MongoDB 与 RDBMS语句比较

1.查询数组第一个元素的price大于400的文档

db.test.find(
{"saleDetial.0.price":{$gt:}},
{"_id":,"name":,"type":,"size":,"saleDetial":}
)

2.$or运算符

查询price大于500或者price小于100的文档

db.test.find(
{$or:[{"saleDetial.price":{$gt:}},{"saleDetial.price":{$lt:}}]},
{"_id":,"name":}
)

注意:$or运算符之后是用中括号,里面的两个条件分别用大括号

3.$and运算符

1.查询价格大于100并且size等于S的文档名:select name from test where price>100 and size='S'

db.test.find(
{$and:[{"saleDetial.price":{$gt:}},{"size":"S"}]},
{"_id":,"name":}
)
等价于
db.test.find(
{"saleDetial.price":{$gt:},"size":"S"},
{"_id":,"name":}
)

对应$and默认可以省略。

注意:如果是同一个字段的and条件必须这样写

db.test.find({"saleDetial.price":{$gt:,$lt:}})

下面这种写法是错误的,这张写法会认为是多个键值的的查询条件,最终的结果就是price>300 or price <500

db.test.find({"saleDetial.price":{$gt:},"saleDetial.price":{$lt:}})

4.$in运算符

相当于关系型数据库的IN

查询price大于100且buyer.name是zhang,chen的文档

db.test.find(
{$and:[{"saleDetial.price":{$gt:}},{"buyer.name":{$in:["zhang","chen"]}}]},
{"_id":,"name":,"buyer":}
)

4.$nin运算符

$nin是in的否则条件

db.test.find(
{$and:[{"saleDetial.price":{$gt:}},{"buyer.name":{$nin:["zhang","chen"]}}]},
{"_id":,"name":,"buyer":}
)

5.$mod:取模匹配运算符

相当于关系型数据库的%运算

查询type%2余数为1的文档

db.test.find(
{"type":{$mod:[,]}},
{"_id":,"name":,"buyer":,"type":}
)

6.$not否定运算

查询type%2余数不等于1的文档

db.test.find(
{"type":{$not:{$mod:[,]}}},
{"_id":,"name":,"buyer":,"type":}
)

7.null值判断

//插入测试数据

db.nullvar.insert([{"x":null},{"x":1},{"x":2}])

//查询null值的数据

db.nullvar.find({"x":null})

在以前2.6之前的版本查询null值非常的麻烦,代码如下:

db.nullvar.find({"x":{"$in":[null],"$exists":true}})

8.模糊查询

使用正则表达式

//查询name以包含short的文档

db.test.find(
{"name":/short/},
{"_id":,"name":,"buyer":,"type":}
)

//查询name以short开头的文档

db.test.find(
{"name":/^short/},
{"_id":,"name":,"buyer":,"type":}
)

//?查询

db.test.find(
{"name":/^coa?t/},
{"_id":,"name":,"buyer":,"type":}
)

9.日期时间查询

 

四、扩展操作

1.sort、skip、limit

db.test.find(
{$or:[{"saleDetial.price":{$gt:}},{"type":{$mod:[,]}}]},
{"_id":,"name":,"buyer":,"type":}
)
.sort({"type":-})
.skip()
.limit()

相当于关系型数据库的写法:

select name,buyer,type from test where price>400 or type%2=0
order by type desc
limit 1,10

参考:http://www.runoob.com/mongodb/mongodb-query.html

备注:

作者:pursuer.chen

博客:http://www.cnblogs.com/chenmh

本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接,否则保留追究责任的权利。

《欢迎交流讨论》

MongoDB入门系列(三):查询(SELECT)的更多相关文章

  1. MyBatis基础入门《三》Select查询集合

    MyBatis基础入门<三>Select查询集合 描述: 代码新增了一个MybatisUtil工具类,查询数据库返回集合的时候,接收数据的三种方式.由于代码会渐渐增多,未涉及改动过的文件不 ...

  2. mybatis入门系列三之类型转换器

    mybatis入门系列三之类型转换器 类型转换器介绍 mybatis作为一个ORM框架,要求java中的对象与数据库中的表记录应该对应 因此java类名-数据库表名,java类属性名-数据库表字段名, ...

  3. C# 互操作性入门系列(三):平台调用中的数据封送处理

    好文章搬用工模式启动ing ..... { 文章中已经包含了原文链接 就不再次粘贴了 言明 改文章是一个系列,但只收录了2篇,原因是 够用了 } --------------------------- ...

  4. [转]C# 互操作性入门系列(三):平台调用中的数据封送处理

    参考网址:https://www.cnblogs.com/FongLuo/p/4512738.html C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列( ...

  5. MongoDB入门系列(一):基础概念和安装

    概述 MongoDB是目前非常流行的一种非关系型数据库,作为入门系列的第一篇本篇文章主要介绍Mongdb的基础概念知识包括命名规则.数据类型.功能以及安装等. 环境: OS:Windows Versi ...

  6. mongodb基础系列——数据库查询数据返回前台JSP(一)

    经过一段时间停顿,终于提笔来重新整理mongodb基础系列博客了. 同时也很抱歉,由于各种原因,没有及时整理出,今天做了一个demo,来演示,mongodb数据库查询的数据在JSP显示问题. 做了一个 ...

  7. ActiveMQ入门系列三:发布/订阅模式

    在上一篇<ActiveMQ入门系列二:入门代码实例(点对点模式)>中提到了ActiveMQ中的两种模式:点对点模式(PTP)和发布/订阅模式(Pub & Sub),详细介绍了点对点 ...

  8. MongoDB入门---文档查询之$type操作符&limit方法&skip方法&简单排序(sort)操作

    上一篇文章呢,已经分享过了一部分查询操作了,这篇文章呢?就来继续分享哈.接下来呢我们直接看MongoDB中的$type操作符哈.它呢是基于BSON类型来检索集合中匹配的数据类型,并且返回结果,在Mon ...

  9. MongoDB入门系列(二):Insert、Update、Delete、Drop

    概述 本章节介绍Insert.Update.Delete.Drop操作基本语法. 环境: Version:3.4 insert insert()基本语法如下: db.collection.insert ...

随机推荐

  1. 51 Nod 1057 N的阶乘【Java大数乱搞】

    1057 N的阶乘 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 输入N求N的阶乘的准确值.   Input 输入N(1 <= N <= 10000) Ou ...

  2. 我的第二个网页制作:p,hn,br标签的使用

    <html> <head> <title>这是我的第二个html代码</title> <body> <!-- <p>Hel ...

  3. flume1.8 Sources类型介绍(二)

    1 Flume Sources 1.1 Avro Source 监听Avro端口,从Avro client streams接收events.要求属性是粗体字. agent a1例子: ipFilter ...

  4. centos6+cdh5.4.0 离线搭建cdh搭建

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  5. 配置 java web Tomcat

    index.jsp-->换为默认的MyEclipse JSP Editor打开方法:window -->Preference-->general-->editors--> ...

  6. HTTPS和HTTP的区别是什么?

    广泛应用于互联网世界的HTTP想必是大家再熟悉不过的了,然而细心的朋友可能发现淘宝.百度.网上银行等网站都变成HTTPS开头,并且还有一把小绿锁挂在地址栏,那么HTTPS和HTTP的区别是什么呢? 一 ...

  7. SVN版本库修改URL路径或者IP地址

    服务器的IP地址或者URL变更,版本库服务器的IP也要修改,因为当初安装SVN URL没有使用别名,所以使用的人都要修改客户端的IP,以下是参考网上的资料. 1.Windows TortoiseSVN ...

  8. vuethink 配置

    http://blog.csdn.net/hero82748274/article/details/76100938 vuethink 是一款基于PHP TP5和Vuejs 结合的后台框架,设计起来是 ...

  9. VisualSFM+PMVS生成稠密点云

    利用相机拍摄一个场景不同角度的图片,使用VisualSFM能够得到稀疏点云,如果想要得到稠密点云,可以在VisualSFM中加入PMVS的应用程序,PMVS会作为一个插件运行将稀疏点云插成稠密的点云. ...

  10. Sublime Text 2激活、插件包安装、以及快捷键

    http://jingyan.baidu.com/article/ff4116259b057c12e48237b8.html Sublime Text作为一款轻量.简洁.高效.跨平台的编辑器.支持N多 ...