MongoDB

<div class="blogpost-body">
<div class="blogpost-body">
<div style="text-align: right;">

一 简介

MongoDB是一款强大、灵活、且易于扩展的通用型数据库
1、易用性

MongoDB是一个面向文档(document-数据库,而不是关系型数据库
不采用关系型主要是为了获得更好得扩展性。当然还有一些其他好处,与关系数据库相比,面向文档的数据库不再有“行“(row)的概念取而代之的是更为灵活的“文档”(document)模型。
通过在文档中嵌入文档和数组,面向文档的方法能够仅使用一条记录来表现复杂的层级关系,这与现代的面向对象语言的开发者对数据的看法一致。 另外,不再有预定义模式(predefined schema):文档的键(key)和值(value)不再是固定的类型和大小。由于没有固定的模式,根据需要添加删除字段变得更容易了。通常由于开发者能够进行快速迭代,所以开发进程得以加快。而且,实验更容易进行。开发者能尝试大量的数据模型,从中选一个最好的。

2、易扩展性

一个小规模的应用程序,需要存储的数据量也可能大的惊人,甚至超出 了很多数据库的处理能力。过去非常罕见的T级数据,现在已经是司空见惯了。 由于需要存储的数据量不断增长,开发者面临一个问题:应该如何扩展数据库,分为纵向扩展和横向扩展,纵向扩展是最省力的做法,但缺点是大型机一般都非常贵,而且 当数据量达到机器的物理极限时,花再多的钱也买不到更强的机器了,此时选择横向扩展更为合适,但横向扩展带来的另外一个问题就是需要管理的机器太多。 MongoDB的设计采用横向扩展。面向文档的数据模型使它能很容易地在多台服务器之间进行数据分割。MongoDB能够自动处理跨集群的数据和负载自动重新分配文档,以及将 用户的请求路由到正确的机器上。这样,开发者能够集中精力编写应用程序,而不需要考虑如何扩展的问题。如果一个集群需要更大的容量,只需要向集群添加新服务器,MongoDB就会自动将现有的数据向新服务器传送

3、丰富的功能

数据库,除了能够创建、读取、更新和删除数据之外,还提供了一系列不断扩展的独特功能 支持通用二级索引,允许多种快速查询,且提供唯一索引、复合索引、地理空间索引、全文索引

<span style="color: #008000;">#<span style="color: #008000;">2、聚合
<span style="color: #000000;">支持聚合管道,用户能通过简单的片段创建复杂的集合,并通过数据库自动优化

<span style="color: #008000;">#<span style="color: #008000;">3、特殊的集合类型
<span style="color: #000000;">支持存在时间有限的集合,适用于那些将在某个时刻过期的数据,如会话session。类似地,MongoDB也支持固定大小的集合,用于保存近期数据,如日志

<span style="color: #008000;">#<span style="color: #008000;">4、文件存储
<span style="color: #000000;">支持一种非常易用的协议,用于存储大文件文件元数据。MongoDB并不具备一些在关系型数据库中很普遍的功能,如链接join和复杂的多行事务。省略
这些的功能是处于架构上的考虑,或者说为了得到更好的扩展性,因为在分布式系统中这两个功能难以高效地实现

4、卓越的性能

一个主要目标是提供卓越的性能,这很大程度上决定了MongoDB的设计。MongoDB把尽可能多的内存用作缓存cache,视图为每次查询自动选择正确的索引。 总之各方面的设计都旨在保持它的高性能 虽然MongoDB非常强大并试图保留关系型数据库的很多特性,但它并不追求具备关系型数据库的所有功能。只要有可能,数据库服务器就会将处理逻辑交给客户端。这种精简方式的设计是MongoDB能够实现如此高性能的原因之一

二 MongoDB基础知识

1、文档是MongoDB的核心概念。文档就是键值对的一个有序集{'msg':'hello','foo':3}。类似于python中的有序字典。

2、集合就是一组文档。如果将MongoDB中的一个文档比喻为关系型数据的一行,那么一个集合就是相当于一张表

<span style="color: #008000;">#<span style="color: #008000;">2、组织子集合的方式就是使用“.”,分隔不同命名空间的子集合。
<span style="color: #000000;">比如一个具有博客功能的应用可能包含两个集合,分别是blog.posts和blog.authors,这是为了使组织结构更清晰,这里的blog集合(这个集合甚至不需要存在)跟它的两个子集合没有任何关系。
在MongoDB中,使用子集合来组织数据非常高效,值得推荐

<span style="color: #008000;">#<span style="color: #008000;">3、当第一个文档插入时,集合就会被创建。合法的集合名:
集合名不能是空字符串<span style="color: #800000;">""<span style="color: #000000;">。
集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
集合名不能以<span style="color: #800000;">"<span style="color: #800000;">system.<span style="color: #800000;">"<span style="color: #000000;">开头,这是为系统集合保留的前缀。
用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。

3、数据库:在MongoDB中,多个文档组成集合,多个集合可以组成数据库

数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-

如果要使用cms数据库中的blog.posts集合,这个集合的命名空间就是 cmd.blog.posts。命名空间的长度不得超过121个字节,且在实际使用中应该小于100个字节

三 安装

1、安装

安装路径为D:\MongoDB,将D:\MongoDB\bin目录加入环境变量

<span style="color: #008000;">#<span style="color: #008000;">2、新建目录与文件
<span style="color: #000000;">D:\MongoDB\data\db
D:\MongoDB\log

<span style="color: #008000;">#<span style="color: #008000;">3、新建配置文件mongod.cfg,参考:https://docs.mongodb.com/manual/reference/configuration-options/
<span style="color: #000000;">systemLog:
destination: file
path: <span style="color: #800000;">D:\MongoDB\log\mongod.log<span style="color: #000000;">
logAppend: true
storage:
journal:
enabled: true
dbPath: <span style="color: #800000;">D:\MongoDB\data\db<span style="color: #000000;">
net:
bindIp: 0.0.0.0<span style="color: #000000;">
port: 27017<span style="color: #000000;">
setParameter:
enableLocalhostAuthBypass: false

<span style="color: #008000;">#<span style="color: #008000;">4、制作系统服务
mongod --config <span style="color: #800000;">"<span style="color: #800000;">D:\MongoDB\mongod.cfg<span style="color: #800000;">" --bind_ip 0.0.0.0 --install <span style="color: #008000;">#<span style="color: #008000;"> 按照指定的配置文件进行配置
<span style="color: #000000;">或者直接在命令行指定配置
mongod --bind_ip 0.0.0.0 --port 27017 --logpath D:\MongoDB\log\mongod.log --logappend --dbpath D:\MongoDB\data\db --serviceName <span style="color: #800000;">"<span style="color: #800000;">MongoDB<span style="color: #800000;">" --servicedisplayName <span style="color: #800000;">"<span style="color: #800000;">MongoDB<span style="color: #800000;">" --install <span style="color: #008000;">#<span style="color: #008000;">执行完会在D:\MongoDB\log下生成mongod.log文件

<span style="color: #008000;">#<span style="color: #008000;">5、启动\关闭
<span style="color: #000000;">net start MongoDB
net stop MongoDB

<span style="color: #008000;">#<span style="color: #008000;">6、登录
<span style="color: #000000;">mongo

链接:http://www.runoob.com/mongodb/mongodb-window-install.html

2、账号管理

创建用户,要先进入到某个数据库中才能进行创建,管理员账号要在admin数据库中创建

createuser( { user: ,db: use test
db.createuser(
{
user:
<span style="color: #800000;">"
<span style="color: #800000;">egon
<span style="color: #800000;">"
<span style="color: #000000;">,roles: [ { role:
<span style="color: #800000;">"
<span style="color: #800000;">readWrite
<span style="color: #800000;">"
,db: <span style="color: #800000;">"
<span style="color: #800000;">test
<span style="color: #800000;">"
<span style="color: #000000;"> },{ role:
<span style="color: #800000;">"
<span style="color: #800000;">read
<span style="color: #800000;">"
,db: <span style="color: #800000;">"
<span style="color: #800000;">db1
<span style="color: #800000;">"
<span style="color: #000000;"> } ]
}
)

<span style="color: #008000;">#<span style="color: #008000;">2、重启数据库,开启认证机制
mongod --<span style="color: #000000;">remove
mongod --config <span style="color: #800000;">"<span style="color: #800000;">D:\MongoDB\mongod.cfg<span style="color: #800000;">" --bind_ip 0.0.0.0 --install --<span style="color: #000000;">auth

mongod --bind_ip 0.0.0.0 --port 27017 --logpath D:\MongoDB\log\mongod.log --logappend --dbpath D:\MongoDB\data\db --serviceName <span style="color: #800000;">"<span style="color: #800000;">MongoDB<span style="color: #800000;">" --servicedisplayName <span style="color: #800000;">"<span style="color: #800000;">MongoDB<span style="color: #800000;">" --install --<span style="color: #000000;">auth

<span style="color: #008000;">#<span style="color: #008000;">3、登录:注意使用双引号而非单引号
mongo --port 27017 -u <span style="color: #800000;">"<span style="color: #800000;">root<span style="color: #800000;">" -p <span style="color: #800000;">"<span style="color: #800000;">123<span style="color: #800000;">" --authenticationDatabase <span style="color: #800000;">"<span style="color: #800000;">admin<span style="color: #800000;">"<span style="color: #000000;">

也可以在登录之后用db.auth(<span style="color: #800000;">"<span style="color: #800000;">账号<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">密码<span style="color: #800000;">"<span style="color: #000000;">)登录
mongo
use admin
db.auth(<span style="color: #800000;">"<span style="color: #800000;">root<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">123<span style="color: #800000;">"<span style="color: #000000;">)

<span style="color: #008000;">#<span style="color: #008000;">推荐博客:https://www.cnblogs.com/zhoujinyi/p/4610050.html

用户权限管理配置

https://www.jianshu.com/p/a4e94bb8a052

3、命令行shell

fig #连接到任何数据库config

<span style="color: #008000;">#<span style="color: #008000;">2、mongo --nodb #不连接到任何数据库

<span style="color: #008000;">#<span style="color: #008000;">3、启动之后,在需要时运行new Mongo(hostname)命令就可以连接到想要的mongod了:

conn=new Mongo(<span style="color: #800000;">'<span style="color: #800000;">127.0.0.1:27017<span style="color: #800000;">'<span style="color: #000000;">)
connection to 127.0.0.1:27017
db=conn.getDB(<span style="color: #800000;">'<span style="color: #800000;">admin<span style="color: #800000;">'<span style="color: #000000;">)
admin

<span style="color: #008000;">#<span style="color: #008000;">4、help查看帮助

<span style="color: #008000;">#<span style="color: #008000;">5、mongo时一个简化的JavaScript shell,是可以执行JavaScript脚本的

四 基本数据类型

1、在概念上,MongoDB的文档与Javascript的对象相近,因而可以认为它类似于JSON。JSON(http://www.json.org)是一种简单的数据表示方式:其规范仅用一段文字就能描述清楚(其官网证明了这点),且仅包含六种数据类型。

2、这样有很多好处:易于理解、易于解析、易于记忆。然而从另一方面说,因为只有null、布尔、数字、字符串、数字和对象这几种数据类型,所以JSON的表达能力有一定的局限。

3、虽然JSON具备的这些类型已经具有很强的表现力,但绝大数应用(尤其是在于数据库打交道时)都还需要其他一些重要的类型。例如,JSON没有日期类型,这使得原本容易日期处理变得烦人。另外,JSON只有一种数字类型,无法区分浮点数和整数,更别区分32位和64位了。再者JSON无法表示其他一些通用类型,如正则表达式或函数。

4、MongoDB在保留了JSON基本键/值对特性的基础上,添加了其他一些数据类型。在不同的编程语言下,这些类型的确切表示有些许差异。下面说明了MongoDB支持的其他通用类型,以及如何正在文档中使用它们

d={ d={:true, d={:3,:3.1415926 d={: d={ d={:/^egon.*?nb$/正则写在//内,后面的i代表:
i 忽略大小写
m 多行匹配模式
x 忽略非转义的空白字符
s 单行匹配模式

<span style="color: #008000;">#<span style="color: #008000;">7、数组
d={<span style="color: #800000;">'<span style="color: #800000;">x<span style="color: #800000;">':[1,<span style="color: #800000;">'<span style="color: #800000;">a<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">v<span style="color: #800000;">'<span style="color: #000000;">]}

<span style="color: #008000;">#<span style="color: #008000;">8、内嵌文档
user={<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">egon<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">addr<span style="color: #800000;">':{<span style="color: #800000;">'<span style="color: #800000;">country<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">China<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">city<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">YT<span style="color: #800000;">'<span style="color: #000000;">}}
user.addr.country

<span style="color: #008000;">#<span style="color: #008000;">9、对象id:是一个12字节的ID,是文档的唯一标识,不可变
d={<span style="color: #800000;">'<span style="color: #800000;">x<span style="color: #800000;">':ObjectId()}

5、_id和ObjectId

MongoDB中存储的文档必须有一个的值可以重复,但同一集合内<span style="color: #008000;">#<span style="color: #008000;">1、ObjectId
ObjectId是<span style="color: #800000;">"
<span style="color: #800000;">_id
<span style="color: #800000;">"
<span style="color: #000000;">的默认类型。因为设计MongoDb的初衷就是用作分布式数据库,所以能够在分片环境中生成
唯一的标识符非常重要,而常规的做法:在多个服务器上同步自动增加主键既费时又费力,这就是MongoDB采用
ObjectId的原因。
ObjectId采用12字节的存储空间,是一个由24个十六进制数字组成的字符串
0
|1|2|3| 4|5|6| 7|8 9|10|11<span style="color: #000000;">
时间戳 机器 PID 计数器
如果快速创建多个ObjectId,会发现每次只有最后几位有变化。另外,中间的几位数字也会变化(要是在创建过程中停顿几秒)。
这是ObjectId的创建方式导致的,如上图

时间戳单位为秒,与随后5个字节组合起来,提供了秒级的唯一性。这个4个字节隐藏了文档的创建时间,绝大多数驱动程序都会提供
一个方法,用于从ObjectId中获取这些信息。

因为使用的是当前时间,很多用户担心要对服务器进行时钟同步。其实没必要,因为时间戳的实际值并不重要,只要它总是不停增加就好。
接下来3个字节是所在主机的唯一标识符。通常是机器主机名的散列值。这样就可以保证不同主机生成不同的ObjectId,不产生冲突

接下来连个字节确保了在同一台机器上并发的多个进程产生的ObjectId是唯一的

前9个字节确保了同一秒钟不同机器不同进程产生的ObjectId是唯一的。最后3个字节是一个自动增加的 计数器。确保相同进程的同一秒产生的
ObjectId也是不一样的。

<span style="color: #008000;">#<span style="color: #008000;">2、自动生成_id
如果插入文档时没有<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">"<span style="color: #000000;">键,系统会自帮你创建 一个。可以由MongoDb服务器来做这件事。
但通常会在客户端由驱动程序完成。这一做法非常好地体现了MongoDb的哲学:能交给客户端驱动程序来做的事情就不要交给服务器来做。
这种理念背后的原因是:即便是像MongoDB这样扩展性非常好的数据库,扩展应用层也要比扩展数据库层容易的多。将工作交给客户端做就
减轻了数据库扩展的负担。

五 CRUD操作

1、数据库操作

use config 数据库不存在,则创建数据库,否则切换到指定数据库

<span style="color: #008000;">#<span style="color: #008000;">2、查
show dbs <span style="color: #008000;">#<span style="color: #008000;">查看所有数据库
<span style="color: #000000;">可以看到,我们刚创建的数据库config并不在数据库的列表中, 要显示它,我们需要向config数据库插入一些数据。
db.table1.insert({<span style="color: #800000;">'<span style="color: #800000;">a<span style="color: #800000;">':1<span style="color: #000000;">})

<span style="color: #008000;">#<span style="color: #008000;">3、删
use config <span style="color: #008000;">#<span style="color: #008000;">先切换到要删的库下
db.dropDatabase() <span style="color: #008000;">#<span style="color: #008000;">删除当前库

2、集合操作

一个文档插入时,集合就会被创建 >> db.table1.insert({:1 : 1> db.table2.insert({:2 : 1<span style="color: #008000;">#<span style="color: #008000;">2、查

<span style="color: #000000;"> show tables <span style="color: #008000;"> #查看当前数据库中所有的集合
table1
table2
> db.table1.find() <span style="color: #008000;">#查看table1中所有的数据

<span style="color: #008000;">#<span style="color: #008000;">3、删

<span style="color: #000000;"> db.table1.drop()
true
><span style="color: #000000;"> show tables
table2

3、文档操作

默认ObjectId,_id不能重复,且在插入后不可变

<span style="color: #008000;">#<span style="color: #008000;">2、插入单条
user0=<span style="color: #000000;">{
<span style="color: #800000;">"<span style="color: #800000;">name<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">egon<span style="color: #800000;">"<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">age<span style="color: #800000;">":10<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">hobbies<span style="color: #800000;">':[<span style="color: #800000;">'<span style="color: #800000;">music<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">read<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">dancing<span style="color: #800000;">'<span style="color: #000000;">],<span style="color: #800000;">'<span style="color: #800000;">addr<span style="color: #800000;">'<span style="color: #000000;">:{
<span style="color: #800000;">'<span style="color: #800000;">country<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">China<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">city<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">BJ<span style="color: #800000;">'<span style="color: #000000;">
}
}

db.test.insert(user0)
db.test.find()

<span style="color: #008000;">#<span style="color: #008000;">3、插入多条
user1=<span style="color: #000000;">{
<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":1<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">name<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">alex<span style="color: #800000;">"<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">city<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">weifang<span style="color: #800000;">'<span style="color: #000000;">
}
}

user2=<span style="color: #000000;">{
<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":2<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">name<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">wupeiqi<span style="color: #800000;">"<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">age<span style="color: #800000;">":20<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">run<span style="color: #800000;">'<span style="color: #000000;">],<span style="color: #800000;">'<span style="color: #800000;">city<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">hebei<span style="color: #800000;">'<span style="color: #000000;">
}
}

user3=<span style="color: #000000;">{
<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":3<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">name<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">yuanhao<span style="color: #800000;">"<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">age<span style="color: #800000;">":30<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">drink<span style="color: #800000;">'<span style="color: #000000;">],<span style="color: #800000;">'<span style="color: #800000;">city<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">heibei<span style="color: #800000;">'<span style="color: #000000;">
}
}

user4=<span style="color: #000000;">{
<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":4<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">name<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">jingliyang<span style="color: #800000;">"<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">age<span style="color: #800000;">":40<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">dancing<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">tea<span style="color: #800000;">'<span style="color: #000000;">],<span style="color: #800000;">'<span style="color: #800000;">city<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">BJ<span style="color: #800000;">'<span style="color: #000000;">
}
}

user5=<span style="color: #000000;">{
<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":5<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">name<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">jinxin<span style="color: #800000;">"<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">age<span style="color: #800000;">":50<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">read<span style="color: #800000;">'<span style="color: #000000;">,],<span style="color: #800000;">'<span style="color: #800000;">city<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">henan<span style="color: #800000;">'<span style="color: #000000;">
}
}
db.user.insertMany([user1,user2,user3,user4,user5])

查 (查询时在最后加上.pretty()可以对查询结果进行美化)

,<,>=,<=

<span style="color: #008000;">#<span style="color: #008000;">1、select * from db1.user where name = "alex";
db.user.find({<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">alex<span style="color: #800000;">'<span style="color: #000000;">})

<span style="color: #008000;">#<span style="color: #008000;">2、select * from db1.user where name != "alex";
db.user.find({<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':{<span style="color: #800000;">"<span style="color: #800000;">$ne<span style="color: #800000;">":<span style="color: #800000;">'<span style="color: #800000;">alex<span style="color: #800000;">'<span style="color: #000000;">}})

<span style="color: #008000;">#<span style="color: #008000;">3、select * from db1.user where id > 2;
db.user.find({<span style="color: #800000;">'<span style="color: #800000;">_id<span style="color: #800000;">':{<span style="color: #800000;">'<span style="color: #800000;">$gt<span style="color: #800000;">':2<span style="color: #000000;">}})

<span style="color: #008000;">#<span style="color: #008000;">4、select * from db1.user where id < 3;
db.user.find({<span style="color: #800000;">'<span style="color: #800000;">_id<span style="color: #800000;">':{<span style="color: #800000;">'<span style="color: #800000;">$lt<span style="color: #800000;">':3<span style="color: #000000;">}})

<span style="color: #008000;">#<span style="color: #008000;">5、select * from db1.user where id >= 2;
db.user.find({<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$gte<span style="color: #800000;">":2<span style="color: #000000;">,}})

<span style="color: #008000;">#<span style="color: #008000;">6、select * from db1.user where id <= 2;
db.user.find({<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$lte<span style="color: #800000;">":2}})

sql:and,or,not

<span style="color: #008000;">#<span style="color: #008000;">1、select * from db1.user where id >= 2 and id < 4;
db.user.find({<span style="color: #800000;">'<span style="color: #800000;">_id<span style="color: #800000;">':{<span style="color: #800000;">"<span style="color: #800000;">$gte<span style="color: #800000;">":2,<span style="color: #800000;">"<span style="color: #800000;">$lt<span style="color: #800000;">":4<span style="color: #000000;">}})

<span style="color: #008000;">#<span style="color: #008000;">2、select * from db1.user where id >= 2 and age < 40;
db.user.find({<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$gte<span style="color: #800000;">":2},<span style="color: #800000;">"<span style="color: #800000;">age<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$lt<span style="color: #800000;">":40<span style="color: #000000;">}})

<span style="color: #008000;">#<span style="color: #008000;">3、select * from db1.user where id >= 5 or name = "alex";
<span style="color: #000000;">db.user.find({
<span style="color: #800000;">"<span style="color: #800000;">$or<span style="color: #800000;">"<span style="color: #000000;">:[
{<span style="color: #800000;">'<span style="color: #800000;">_id<span style="color: #800000;">':{<span style="color: #800000;">"<span style="color: #800000;">$gte<span style="color: #800000;">":5<span style="color: #000000;">}},{<span style="color: #800000;">"<span style="color: #800000;">name<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">alex<span style="color: #800000;">"<span style="color: #000000;">}
]
})

<span style="color: #008000;">#<span style="color: #008000;">4、select * from db1.user where id % 2=1;
db.user.find({<span style="color: #800000;">'<span style="color: #800000;">_id<span style="color: #800000;">':{<span style="color: #800000;">"<span style="color: #800000;">$mod<span style="color: #800000;">":[2,1<span style="color: #000000;">]}})

<span style="color: #008000;">#<span style="color: #008000;">5、上题,取反
db.user.find({<span style="color: #800000;">'<span style="color: #800000;">_id<span style="color: #800000;">':{<span style="color: #800000;">"<span style="color: #800000;">$not<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$mod<span style="color: #800000;">":[2,1]}}})

sql:in,not in

<span style="color: #008000;">#<span style="color: #008000;">1、select * from db1.user where age in (20,30,31);
db.user.find({<span style="color: #800000;">"<span style="color: #800000;">age<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$in<span style="color: #800000;">":[20,31<span style="color: #000000;">]}})

<span style="color: #008000;">#<span style="color: #008000;">2、select * from db1.user where name not in ('alex','yuanhao');
db.user.find({<span style="color: #800000;">"<span style="color: #800000;">name<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$nin<span style="color: #800000;">":[<span style="color: #800000;">'<span style="color: #800000;">alex<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">yuanhao<span style="color: #800000;">']}})

sql: regexp 正则

<span style="color: #008000;">#<span style="color: #008000;">1、select from db1.user where name regexp '^j.?(g|n)$';
db.user.find({<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':/^j.*?(g|n)$/i})

db.user.find({:3},{:0,:1,:1})

db.user.find({:<span style="color: #008000;">#<span style="color: #008000;">2、查看既有dancing爱好又有tea爱好的人
<span style="color: #000000;">db.user.find({
<span style="color: #800000;">'
<span style="color: #800000;">hobbies
<span style="color: #800000;">'
<span style="color: #000000;">:{
<span style="color: #800000;">"
<span style="color: #800000;">$all<span style="color: #800000;">":[<span style="color: #800000;">'<span style="color: #800000;">dancing<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">tea<span style="color: #800000;">'<span style="color: #000000;">]
}
})

<span style="color: #008000;">#<span style="color: #008000;">3、查看第4个爱好为tea的人
db.user.find({<span style="color: #800000;">"<span style="color: #800000;">hobbies.3<span style="color: #800000;">":<span style="color: #800000;">'<span style="color: #800000;">tea<span style="color: #800000;">'<span style="color: #000000;">})

<span style="color: #008000;">#<span style="color: #008000;">4、查看所有人最后两个爱好
db.user.find({},{<span style="color: #800000;">'<span style="color: #800000;">hobbies<span style="color: #800000;">':{<span style="color: #800000;">"<span style="color: #800000;">$slice<span style="color: #800000;">":-2},<span style="color: #800000;">"<span style="color: #800000;">age<span style="color: #800000;">":0,<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":0,<span style="color: #800000;">"<span style="color: #800000;">name<span style="color: #800000;">":0,<span style="color: #800000;">"<span style="color: #800000;">addr<span style="color: #800000;">"<span style="color: #000000;">:0})

<span style="color: #008000;">#<span style="color: #008000;">5、查看所有人的第2个到第3个爱好
db.user.find({},{<span style="color: #800000;">'<span style="color: #800000;">hobbies<span style="color: #800000;">':{<span style="color: #800000;">"<span style="color: #800000;">$slice<span style="color: #800000;">":[1,2]},<span style="color: #800000;">"<span style="color: #800000;">addr<span style="color: #800000;">"<span style="color: #000000;">:0})

><span style="color: #000000;"> db.blog.find().pretty()
{
<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">" : 1<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">name<span style="color: #800000;">" : <span style="color: #800000;">"<span style="color: #800000;">alex意外死亡的真相<span style="color: #800000;">"<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">comments<span style="color: #800000;">"<span style="color: #000000;"> : [
{
<span style="color: #800000;">"<span style="color: #800000;">name<span style="color: #800000;">" : <span style="color: #800000;">"<span style="color: #800000;">egon<span style="color: #800000;">"<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">content<span style="color: #800000;">" : <span style="color: #800000;">"<span style="color: #800000;">alex是谁???<span style="color: #800000;">"<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">thumb<span style="color: #800000;">" : 200<span style="color: #000000;">
},{
<span style="color: #800000;">"<span style="color: #800000;">name<span style="color: #800000;">" : <span style="color: #800000;">"<span style="color: #800000;">wxx<span style="color: #800000;">"<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">content<span style="color: #800000;">" : <span style="color: #800000;">"<span style="color: #800000;">我去,真的假的<span style="color: #800000;">"<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">thumb<span style="color: #800000;">" : 300<span style="color: #000000;">
},{
<span style="color: #800000;">"<span style="color: #800000;">name<span style="color: #800000;">" : <span style="color: #800000;">"<span style="color: #800000;">yxx<span style="color: #800000;">"<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">content<span style="color: #800000;">" : <span style="color: #800000;">"<span style="color: #800000;">吃喝嫖赌抽,欠下两个亿<span style="color: #800000;">"<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">thumb<span style="color: #800000;">" : 40<span style="color: #000000;">
},{
<span style="color: #800000;">"<span style="color: #800000;">name<span style="color: #800000;">" : <span style="color: #800000;">"<span style="color: #800000;">egon<span style="color: #800000;">"<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">content<span style="color: #800000;">" : <span style="color: #800000;">"<span style="color: #800000;">xxx<span style="color: #800000;">"<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">thumb<span style="color: #800000;">"<span style="color: #000000;"> : 0
}
]
}
db.blog.find({},{<span style="color: #800000;">'<span style="color: #800000;">comments<span style="color: #800000;">':{<span style="color: #800000;">"<span style="color: #800000;">$slice<span style="color: #800000;">":-2}}).pretty() <span style="color: #008000;">#<span style="color: #008000;">查询最后两个
db.blog.find({},{<span style="color: #800000;">'<span style="color: #800000;">comments<span style="color: #800000;">':{<span style="color: #800000;">"<span style="color: #800000;">$slice<span style="color: #800000;">":[1,2]}}).pretty() <span style="color: #008000;">#<span style="color: #008000;">查询1到2

查询数组

db.user.find().sort({:1.sort({:-1,:1})

分页:--limit代表取多少个document,skip代表跳过前多少个document。 db.user.find().sort({:1}).limit(1).skip(2)
分页

获取数量 db.user.count({:{:30--<span style="color: #000000;">或者
db.user.find({
<span style="color: #800000;">'
<span style="color: #800000;">age
<span style="color: #800000;">'
:{<span style="color: #800000;">"
<span style="color: #800000;">$gt
<span style="color: #800000;">"
:30}}).count()

获取数量

db.t2.insert({:10,:111:20> db.t2.find({<span style="color: #800000;">"<span style="color: #800000;">b<span style="color: #800000;">"<span style="color: #000000;">:null})
{
<span style="color: #800000;">"
<span style="color: #800000;">_id
<span style="color: #800000;">"
: ObjectId(<span style="color: #800000;">"
<span style="color: #800000;">5a5cc2a7c1b4645aad959e5a
<span style="color: #800000;">"
),<span style="color: #800000;">"
<span style="color: #800000;">a
<span style="color: #800000;">"
: 20<span style="color: #000000;"> }
{
<span style="color: #800000;">"
<span style="color: #800000;">_id
<span style="color: #800000;">" : ObjectId(<span style="color: #800000;">"<span style="color: #800000;">5a5cc2a8c1b4645aad959e5b<span style="color: #800000;">"),<span style="color: #800000;">"<span style="color: #800000;">b<span style="color: #800000;">"<span style="color: #000000;"> : null }

<span style="color: #008000;">#<span style="color: #008000;">2、查找所有
db.user.find() <span style="color: #008000;">#<span style="color: #008000;">等同于db.user.find({})
<span style="color: #000000;">db.user.find().pretty()

<span style="color: #008000;">#<span style="color: #008000;">3、查找一个,与find用法一致,只是只取匹配成功的第一个
db.user.findOne({<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$gt<span style="color: #800000;">":3}})

方法用于更新已存在的文档。语法格式如下: db.collection.update( =,sex= where name= age=18query : 相当于where条件。
update : update的对象和一些更新的操作符(如$,$inc...等,相当于set后面的
upsert : 可选,认为false,代表如果不存在update的记录不更新也不插入,设置为true代表插入。
multi : 可选,认为false,代表只更新找到的第一条记录,设为true,代表更新找到的全部记录。
writeConcern :可选,抛出异常的级别。

更新操作是不可分割的:若两个更新同时发送,先到达服务器的先执行,然后执行另外一个,不会破坏文档。

删除,否则_id是始终不会变的 db.user.update({:20},{:,:3:2,:,:3<span style="color: #008000;">#<span style="color: #008000;">2、一种最简单的更新就是用一个新的文档完全替换匹配的文档。这适用于大规模式迁移的情况。例如
var obj=db.user.findOne({<span style="color: #800000;">"
<span style="color: #800000;">_id
<span style="color: #800000;">"
:2<span style="color: #000000;">})

obj.username=obj.name+<span style="color: #800000;">'<span style="color: #800000;">SB<span style="color: #800000;">'<span style="color: #000000;">
obj.hobbies_count++<span style="color: #000000;">
delete obj.age

db.user.update({<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":2},obj)

修改器,指定对文档中的某些字段进行更新。 更新修改器是种特殊的键,用来指定复杂的更新操作,比如修改增加后者删除

<span style="color: #008000;">#<span style="color: #008000;">1、update db1.user set name="WXX" where id = 2
db.user.update({<span style="color: #800000;">'<span style="color: #800000;">_id<span style="color: #800000;">':2},{<span style="color: #800000;">"<span style="color: #800000;">$set<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">name<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">WXX<span style="color: #800000;">"<span style="color: #000000;">,}})

<span style="color: #008000;">#<span style="color: #008000;">2、没有匹配成功则新增一条{"upsert":true}
db.user.update({<span style="color: #800000;">'<span style="color: #800000;">_id<span style="color: #800000;">':6},{<span style="color: #800000;">"<span style="color: #800000;">$set<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">name<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">egon<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">age<span style="color: #800000;">":18}},{<span style="color: #800000;">"<span style="color: #800000;">upsert<span style="color: #800000;">"<span style="color: #000000;">:true})

<span style="color: #008000;">#<span style="color: #008000;">3、认只改匹配成功的第一条,{"multi":改多条}
db.user.update({<span style="color: #800000;">'<span style="color: #800000;">_id<span style="color: #800000;">':{<span style="color: #800000;">"<span style="color: #800000;">$gt<span style="color: #800000;">":4}},{<span style="color: #800000;">"<span style="color: #800000;">$set<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">age<span style="color: #800000;">":28<span style="color: #000000;">}})
db.user.update({<span style="color: #800000;">'<span style="color: #800000;">_id<span style="color: #800000;">':{<span style="color: #800000;">"<span style="color: #800000;">$gt<span style="color: #800000;">":4}},{<span style="color: #800000;">"<span style="color: #800000;">$set<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">age<span style="color: #800000;">":38}},{<span style="color: #800000;">"<span style="color: #800000;">multi<span style="color: #800000;">"<span style="color: #000000;">:true})

<span style="color: #008000;">#<span style="color: #008000;">4、修改内嵌文档,把名字为alex的人所在的地址国家改成Japan
db.user.update({<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':<span style="color: #800000;">"<span style="color: #800000;">alex<span style="color: #800000;">"},{<span style="color: #800000;">"<span style="color: #800000;">$set<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">addr.country<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">Japan<span style="color: #800000;">"<span style="color: #000000;">}})

<span style="color: #008000;">#<span style="color: #008000;">5、把名字为alex的人的地2个爱好改成piao
db.user.update({<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':<span style="color: #800000;">"<span style="color: #800000;">alex<span style="color: #800000;">"},{<span style="color: #800000;">"<span style="color: #800000;">$set<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">hobbies.1<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">piao<span style="color: #800000;">"<span style="color: #000000;">}})

<span style="color: #008000;">#<span style="color: #008000;">6、删除alex的爱好,$unset
db.user.update({<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':<span style="color: #800000;">"<span style="color: #800000;">alex<span style="color: #800000;">"},{<span style="color: #800000;">"<span style="color: #800000;">$unset<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">hobbies<span style="color: #800000;">":<span style="color: #800000;">""}})

增加和减少:$inc

<span style="color: #008000;">#<span style="color: #008000;">1、所有人年龄增加一岁
<span style="color: #000000;">db.user.update({},{
<span style="color: #800000;">"<span style="color: #800000;">$inc<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">age<span style="color: #800000;">":1<span style="color: #000000;">}
},{
<span style="color: #800000;">"<span style="color: #800000;">multi<span style="color: #800000;">"<span style="color: #000000;">:true
}
)
<span style="color: #008000;">#<span style="color: #008000;">2、所有人年龄减少5岁
<span style="color: #000000;">db.user.update({},{
<span style="color: #800000;">"<span style="color: #800000;">$inc<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">age<span style="color: #800000;">":-5<span style="color: #000000;">}
},{
<span style="color: #800000;">"<span style="color: #800000;">multi<span style="color: #800000;">"<span style="color: #000000;">:true
}
)

增加和减少:$inc

添加删除数组内元素 添加元素:$push 添加一个爱好read db.user.update({:},{:{:<span style="color: #008000;">#<span style="color: #008000;">2、为名字为yuanhao的人一次添加多个爱好tea,dancing
db.user.update({<span style="color: #800000;">"
<span style="color: #800000;">name
<span style="color: #800000;">"
:<span style="color: #800000;">"
<span style="color: #800000;">yuanhao
<span style="color: #800000;">"
},{<span style="color: #800000;">"
<span style="color: #800000;">$push
<span style="color: #800000;">"
<span style="color: #000000;">:{
<span style="color: #800000;">"
<span style="color: #800000;">hobbies
<span style="color: #800000;">"
:{<span style="color: #800000;">"
<span style="color: #800000;">$each
<span style="color: #800000;">":[<span style="color: #800000;">"<span style="color: #800000;">tea<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">dancing<span style="color: #800000;">"<span style="color: #000000;">]}
}})

按照位置且只能从开头或结尾删除元素:$pop
<span style="color: #008000;">#<span style="color: #008000;">3、{"$pop":{"key":1}} 从数组末尾删除一个元素
<span style="color: #000000;">
db.user.update({<span style="color: #800000;">"<span style="color: #800000;">name<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">yuanhao<span style="color: #800000;">"},{<span style="color: #800000;">"<span style="color: #800000;">$pop<span style="color: #800000;">"<span style="color: #000000;">:{
<span style="color: #800000;">"<span style="color: #800000;">hobbies<span style="color: #800000;">":1<span style="color: #000000;">}
})

<span style="color: #008000;">#<span style="color: #008000;">4、{"$pop":{"key":-1}} 从头部删除
db.user.update({<span style="color: #800000;">"<span style="color: #800000;">name<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">yuanhao<span style="color: #800000;">"},{<span style="color: #800000;">"<span style="color: #800000;">$pop<span style="color: #800000;">"<span style="color: #000000;">:{
<span style="color: #800000;">"<span style="color: #800000;">hobbies<span style="color: #800000;">":-1<span style="color: #000000;">}
})

<span style="color: #008000;">#<span style="color: #008000;">5、按照条件删除元素,:"$pull" 把符合条件的统统删掉,而$pop只能从两端删
db.user.update({<span style="color: #800000;">'<span style="color: #800000;">addr.country<span style="color: #800000;">':<span style="color: #800000;">"<span style="color: #800000;">China<span style="color: #800000;">"},{<span style="color: #800000;">"<span style="color: #800000;">$pull<span style="color: #800000;">"<span style="color: #000000;">:{
<span style="color: #800000;">"<span style="color: #800000;">hobbies<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">read<span style="color: #800000;">"<span style="color: #000000;">}
},{
<span style="color: #800000;">"<span style="color: #800000;">multi<span style="color: #800000;">"<span style="color: #000000;">:true
}
)

添加删除数组内元素:$push,$pop,$pull

添加重复:"$addToSet" :1,db.urls.update({<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":1},{<span style="color: #800000;">"<span style="color: #800000;">$addToSet<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">urls<span style="color: #800000;">":<span style="color: #800000;">'<span style="color: #800000;">http://www.baidu.com<span style="color: #800000;">'<span style="color: #000000;">}})
db.urls.update({<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":1},{<span style="color: #800000;">"<span style="color: #800000;">$addToSet<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">urls<span style="color: #800000;">":<span style="color: #800000;">'<span style="color: #800000;">http://www.baidu.com<span style="color: #800000;">'<span style="color: #000000;">}})

db.urls.update({<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":1<span style="color: #000000;">},{
<span style="color: #800000;">"<span style="color: #800000;">$addToSet<span style="color: #800000;">"<span style="color: #000000;">:{
<span style="color: #800000;">"<span style="color: #800000;">urls<span style="color: #800000;">"<span style="color: #000000;">:{
<span style="color: #800000;">"<span style="color: #800000;">$each<span style="color: #800000;">"<span style="color: #000000;">:[
<span style="color: #800000;">'<span style="color: #800000;">http://www.baidu.com<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">http://www.baidu.com<span style="color: #800000;">'<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">http://www.xxxx.com<span style="color: #800000;">'<span style="color: #000000;">
]
}
}
}
)

添加重复:"$addToSet"

:5:{:[,,:-2<span style="color: #008000;">#<span style="color: #008000;">2、了解:排序The $sort element value must be either 1 or -1"
db.user.update({<span style="color: #800000;">"
<span style="color: #800000;">_id
<span style="color: #800000;">"
:5<span style="color: #000000;">},
<span style="color: #800000;">"
<span style="color: #800000;">$slice
<span style="color: #800000;">"
:-1<span style="color: #000000;">,
<span style="color: #800000;">"
<span style="color: #800000;">$sort
<span style="color: #800000;">"
:-1<span style="color: #000000;">
}
}
})

<span style="color: #008000;">#<span style="color: #008000;">注意:不能只将"$slice"或者"$sort"与"$push"配合使用,且必须使用"$eah"

bed58')">

bed58" class="cnblogs_code_hide">
删除多个中的第一个
db.user.deleteOne({ : 8<span style="color: #008000;">#<span style="color: #008000;">2、删除国家为China的全部
db.user.deleteMany( {<span style="color: #800000;">'
<span style="color: #800000;">addr.country
<span style="color: #800000;">': <span style="color: #800000;">'<span style="color: #800000;">China<span style="color: #800000;">'<span style="color: #000000;">} )

<span style="color: #008000;">#<span style="color: #008000;">3、删除全部
db.user.deleteMany({})

4、聚合

提取出来那么简单了;你可能希望对数据进行分析并加以利用。MongoDB提供了以下聚合工具: distinct和group。(详见MongoDB权威指南)

<span style="color: #008000;">#<span style="color: #008000;">聚合框架:
<span style="color: #000000;">可以使用多个构件创建一个管道,上一个构件的结果传给下一个构件。
这些构件包括(括号内为构件对应的操作符):筛选($match)、投射($project)、分组($group)、排序($sort)、限制($limit)、跳过($skip)
不同的管道操作符可以任意组合,重复使用

pymongo client=MongoClient(<span style="color: #800000;">'<span style="color: #800000;">mongodb://root:123@localhost:27017<span style="color: #800000;">'<span style="color: #000000;">)
table
=client[<span style="color: #800000;">'<span style="color: #800000;">db1<span style="color: #800000;">'][<span style="color: #800000;">'<span style="color: #800000;">emp<span style="color: #800000;">'<span style="color: #000000;">]
<span style="color: #008000;">#<span style="color: #008000;"> table.drop()
<span style="color: #000000;">
l=<span style="color: #000000;">[
(<span style="color: #800000;">'<span style="color: #800000;">egon<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">male<span style="color: #800000;">',18,<span style="color: #800000;">'<span style="color: #800000;">20170301<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">老男孩驻沙河办事处外交大使<span style="color: #800000;">',7300.33,401,1),<span style="color: #008000;">#<span style="color: #008000;">以下是教学部
(<span style="color: #800000;">'<span style="color: #800000;">alex<span style="color: #800000;">',78,<span style="color: #800000;">'<span style="color: #800000;">20150302<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">teacher<span style="color: #800000;">',1000000.31,1<span style="color: #000000;">),(<span style="color: #800000;">'<span style="color: #800000;">wupeiqi<span style="color: #800000;">',81,<span style="color: #800000;">'<span style="color: #800000;">20130305<span style="color: #800000;">',8300,(<span style="color: #800000;">'<span style="color: #800000;">yuanhao<span style="color: #800000;">',73,<span style="color: #800000;">'<span style="color: #800000;">20140701<span style="color: #800000;">',3500,(<span style="color: #800000;">'<span style="color: #800000;">liwenzhou<span style="color: #800000;">',28,<span style="color: #800000;">'<span style="color: #800000;">20121101<span style="color: #800000;">',2100,(<span style="color: #800000;">'<span style="color: #800000;">jingliyang<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">female<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">20110211<span style="color: #800000;">',9000,(<span style="color: #800000;">'<span style="color: #800000;">jinxin<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">19000301<span style="color: #800000;">',30000,(<span style="color: #800000;">'<span style="color: #800000;">成龙<span style="color: #800000;">',48,<span style="color: #800000;">'<span style="color: #800000;">20101111<span style="color: #800000;">',10000,(<span style="color: #800000;">'<span style="color: #800000;">歪歪<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">20150311<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">sale<span style="color: #800000;">',3000.13,402,2),<span style="color: #008000;">#<span style="color: #008000;">以下是销售部门
(<span style="color: #800000;">'<span style="color: #800000;">丫丫<span style="color: #800000;">',38,<span style="color: #800000;">'<span style="color: #800000;">20101101<span style="color: #800000;">',2000.35,2<span style="color: #000000;">),(<span style="color: #800000;">'<span style="color: #800000;">丁丁<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">20110312<span style="color: #800000;">',1000.37,(<span style="color: #800000;">'<span style="color: #800000;">星星<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">20160513<span style="color: #800000;">',3000.29,(<span style="color: #800000;">'<span style="color: #800000;">格格<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">20170127<span style="color: #800000;">',4000.33,(<span style="color: #800000;">'<span style="color: #800000;">张野<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">20160311<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">operation<span style="color: #800000;">',10000.13,403,3),<span style="color: #008000;">#<span style="color: #008000;">以下是运营部门
(<span style="color: #800000;">'<span style="color: #800000;">程咬金<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">19970312<span style="color: #800000;">',20000,3<span style="color: #000000;">),(<span style="color: #800000;">'<span style="color: #800000;">程咬银<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">20130311<span style="color: #800000;">',19000,(<span style="color: #800000;">'<span style="color: #800000;">程咬铜<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">20150411<span style="color: #800000;">',18000,(<span style="color: #800000;">'<span style="color: #800000;">程咬铁<span style="color: #800000;">',<span style="color: #800000;">'<span style="color: #800000;">20140512<span style="color: #800000;">',17000,3<span style="color: #000000;">)
]

<span style="color: #0000ff;">for n,item <span style="color: #0000ff;">in<span style="color: #000000;"> enumerate(l):
d=<span style="color: #000000;">{
<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">"<span style="color: #000000;">:n,<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">'<span style="color: #000000;">:item[0],<span style="color: #800000;">'<span style="color: #800000;">sex<span style="color: #800000;">':item[1<span style="color: #000000;">],<span style="color: #800000;">'<span style="color: #800000;">age<span style="color: #800000;">':item[2<span style="color: #000000;">],<span style="color: #800000;">'<span style="color: #800000;">hire_date<span style="color: #800000;">':datetime.datetime.strptime(item[3],<span style="color: #800000;">'<span style="color: #800000;">%Y%m%d<span style="color: #800000;">'<span style="color: #000000;">),<span style="color: #800000;">'<span style="color: #800000;">post<span style="color: #800000;">':item[4<span style="color: #000000;">],<span style="color: #800000;">'<span style="color: #800000;">salary<span style="color: #800000;">':item[5<span style="color: #000000;">]
}
table.save(d)

{:{:查询操作符$gt,$lt,$in等

<span style="color: #008000;">#<span style="color: #008000;">例1、select * from db1.emp where post='teacher';
db.emp.aggregate({<span style="color: #800000;">"<span style="color: #800000;">$match<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">post<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">teacher<span style="color: #800000;">"<span style="color: #000000;">}})

<span style="color: #008000;">#<span style="color: #008000;">例2、select * from db1.emp where id > 3 group by post;
<span style="color: #000000;">db.emp.aggregate(
{<span style="color: #800000;">"<span style="color: #800000;">$match<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$gt<span style="color: #800000;">":3<span style="color: #000000;">}}},{<span style="color: #800000;">"<span style="color: #800000;">$group<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$post<span style="color: #800000;">",<span style="color: #800000;">'<span style="color: #800000;">avg_salary<span style="color: #800000;">':{<span style="color: #800000;">"<span style="color: #800000;">$avg<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$salary<span style="color: #800000;">"<span style="color: #000000;">}}}
)

<span style="color: #008000;">#<span style="color: #008000;">例3、select * from db1.emp where id > 3 group by post having avg(salary) > 10000;
<span style="color: #000000;">db.emp.aggregate(
{<span style="color: #800000;">"<span style="color: #800000;">$match<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$gt<span style="color: #800000;">":3<span style="color: #000000;">}}},<span style="color: #800000;">'<span style="color: #800000;">avg_salary<span style="color: #800000;">':{<span style="color: #800000;">"<span style="color: #800000;">$avg<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$salary<span style="color: #800000;">"<span style="color: #000000;">}}},{<span style="color: #800000;">"<span style="color: #800000;">$match<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">avg_salary<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$gt<span style="color: #800000;">":10000<span style="color: #000000;">}}}
)

{:{:1,:0,:<span style="color: #008000;">#<span style="color: #008000;">1、select name,post,(age+1) as new_age from db1.emp;
<span style="color: #000000;">db.emp.aggregate(
{
<span style="color: #800000;">"
<span style="color: #800000;">$project
<span style="color: #800000;">"
<span style="color: #000000;">:{
<span style="color: #800000;">"
<span style="color: #800000;">name
<span style="color: #800000;">"
:1<span style="color: #000000;">,
<span style="color: #800000;">"
<span style="color: #800000;">post
<span style="color: #800000;">"
:1<span style="color: #000000;">,
<span style="color: #800000;">"<span style="color: #800000;">new_age<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$add<span style="color: #800000;">":[<span style="color: #800000;">"<span style="color: #800000;">$age<span style="color: #800000;">",1<span style="color: #000000;">]}
}
})

<span style="color: #008000;">#<span style="color: #008000;">2、表达式之数学表达式
{<span style="color: #800000;">"<span style="color: #800000;">$add<span style="color: #800000;">":[expr1,expr2,...,exprN]} <span style="color: #008000;">#<span style="color: #008000;">相加
{<span style="color: #800000;">"<span style="color: #800000;">$subtract<span style="color: #800000;">":[expr1,expr2]} <span style="color: #008000;">#<span style="color: #008000;">第一个减第二个
{<span style="color: #800000;">"<span style="color: #800000;">$multiply<span style="color: #800000;">":[expr1,exprN]} <span style="color: #008000;">#<span style="color: #008000;">相乘
{<span style="color: #800000;">"<span style="color: #800000;">$divide<span style="color: #800000;">":[expr1,expr2]} <span style="color: #008000;">#<span style="color: #008000;">第一个表达式除以第二个表达式的商作为结果
{<span style="color: #800000;">"<span style="color: #800000;">$mod<span style="color: #800000;">":[expr1,expr2]} <span style="color: #008000;">#<span style="color: #008000;">第一个表达式除以第二个表达式得到的余数作为结果

<span style="color: #008000;">#<span style="color: #008000;">3、表达式之日期表达式:$year,$month,$week,$dayOfMonth,$dayOfWeek,$dayOfYear,$hour,$minute,$second<span style="color: #008000;">

<span style="color: #008000;">例如:select name,date_format("%Y") as hire_year from db1.emp

<span style="color: #000000;">db.emp.aggregate(
{<span style="color: #800000;">"<span style="color: #800000;">$project<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">name<span style="color: #800000;">":1,<span style="color: #800000;">"<span style="color: #800000;">hire_year<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$year<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$hire_date<span style="color: #800000;">"<span style="color: #000000;">}}}
)

<span style="color: #008000;">#<span style="color: #008000;">例如查看每个员工的工作多长时间
<span style="color: #000000;">db.emp.aggregate(
{<span style="color: #800000;">"<span style="color: #800000;">$project<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">name<span style="color: #800000;">":1,<span style="color: #800000;">"<span style="color: #800000;">hire_period<span style="color: #800000;">"<span style="color: #000000;">:{
<span style="color: #800000;">"<span style="color: #800000;">$subtract<span style="color: #800000;">"<span style="color: #000000;">:[
{<span style="color: #800000;">"<span style="color: #800000;">$year<span style="color: #800000;">"<span style="color: #000000;">:new Date()},{<span style="color: #800000;">"<span style="color: #800000;">$year<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$hire_date<span style="color: #800000;">"<span style="color: #000000;">}
]
}}}
)

<span style="color: #008000;">#<span style="color: #008000;">4、字符串表达式
{<span style="color: #800000;">"<span style="color: #800000;">$substr<span style="color: #800000;">":[字符串/<span style="color: #000000;">$值为字符串的字段名,起始位置,截取几个字节]}
{<span style="color: #800000;">"<span style="color: #800000;">$concat<span style="color: #800000;">":[expr1,exprN]} <span style="color: #008000;">#<span style="color: #008000;">指定的表达式或字符串连接在一起返回,只支持字符串拼接
{<span style="color: #800000;">"<span style="color: #800000;">$toLower<span style="color: #800000;">"<span style="color: #000000;">:expr}
{<span style="color: #800000;">"<span style="color: #800000;">$toupper<span style="color: #800000;">"<span style="color: #000000;">:expr}

db.emp.aggregate( {<span style="color: #800000;">"<span style="color: #800000;">$project<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">NAME<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$toupper<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$name<span style="color: #800000;">"<span style="color: #000000;">}}})

<span style="color: #008000;">#<span style="color: #008000;">5、逻辑表达式
$<span style="color: #0000ff;">and<span style="color: #000000;">
$<span style="color: #0000ff;">or<span style="color: #000000;">
$<span style="color: #0000ff;">not<span style="color: #000000;">
其他见Mongodb权威指南

{:{:分组字段,<span style="color: #008000;">#<span style="color: #008000;">1、将分组字段传给$group函数的_id字段即可
{<span style="color: #800000;">"
<span style="color: #800000;">$group
<span style="color: #800000;">"
:{<span style="color: #800000;">"
<span style="color: #800000;">_id
<span style="color: #800000;">"
:<span style="color: #800000;">"
<span style="color: #800000;">$sex<span style="color: #800000;">"}} <span style="color: #008000;">#<span style="color: #008000;">按照性别分组
{<span style="color: #800000;">"<span style="color: #800000;">$group<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$post<span style="color: #800000;">"}} <span style="color: #008000;">#<span style="color: #008000;">按照职位分组
{<span style="color: #800000;">"<span style="color: #800000;">$group<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">state<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$state<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">city<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$city<span style="color: #800000;">"}}} <span style="color: #008000;">#<span style="color: #008000;">按照多个字段分组,比如按照州市分组

<span style="color: #008000;">#<span style="color: #008000;">2、分组后聚合得结果,类似于sql中聚合函数的聚合操作符:$sum、$avg、$max、$min、$first、$last<span style="color: #008000;">

<span style="color: #008000;">例1:select post,max(salary) from db1.emp group by post;

db.emp.aggregate({<span style="color: #800000;">"<span style="color: #800000;">$group<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$post<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">max_salary<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$max<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$salary<span style="color: #800000;">"<span style="color: #000000;">}}})

<span style="color: #008000;">#<span style="color: #008000;">例2:去每个部门最大薪资与最低薪资
db.emp.aggregate({<span style="color: #800000;">"<span style="color: #800000;">$group<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$post<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">max_salary<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$max<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$salary<span style="color: #800000;">"},<span style="color: #800000;">"<span style="color: #800000;">min_salary<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$min<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$salary<span style="color: #800000;">"<span style="color: #000000;">}}})

<span style="color: #008000;">#<span style="color: #008000;">例3:如果字段是排序后的,那么$first,$last会很有用,比用$max和$min效率高
db.emp.aggregate({<span style="color: #800000;">"<span style="color: #800000;">$group<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$post<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">first_id<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$first<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$_id<span style="color: #800000;">"<span style="color: #000000;">}}})

<span style="color: #008000;">#<span style="color: #008000;">3、数组操作符
{<span style="color: #800000;">"<span style="color: #800000;">$addToSet<span style="color: #800000;">"<span style="color: #000000;">:expr}:不重复
{<span style="color: #800000;">"<span style="color: #800000;">$push<span style="color: #800000;">"<span style="color: #000000;">:expr}:重复

<span style="color: #008000;">#<span style="color: #008000;">例:查询岗位名以及各岗位内的员工姓名:select post,group_concat(name) from db1.emp group by post;
db.emp.aggregate({<span style="color: #800000;">"<span style="color: #800000;">$group<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$post<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">names<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$push<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$name<span style="color: #800000;">"<span style="color: #000000;">}}})
db.emp.aggregate({<span style="color: #800000;">"<span style="color: #800000;">$group<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$post<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">names<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$addToSet<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$name<span style="color: #800000;">"}}})

{:{:1,:-1}} {:n}

<span style="color: #008000;">#<span style="color: #008000;">例1、取平均工资最高的前两个部门
<span style="color: #000000;">db.emp.aggregate(
{
<span style="color: #800000;">"<span style="color: #800000;">$group<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$post<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">平均工资<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$avg<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$salary<span style="color: #800000;">"<span style="color: #000000;">}}
},{
<span style="color: #800000;">"<span style="color: #800000;">$sort<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">平均工资<span style="color: #800000;">":-1<span style="color: #000000;">}
},{
<span style="color: #800000;">"<span style="color: #800000;">$limit<span style="color: #800000;">":2<span style="color: #000000;">
}
)
<span style="color: #008000;">#<span style="color: #008000;">例2、
<span style="color: #000000;">db.emp.aggregate(
{
<span style="color: #800000;">"<span style="color: #800000;">$group<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$post<span style="color: #800000;">",{
<span style="color: #800000;">"<span style="color: #800000;">$limit<span style="color: #800000;">":2<span style="color: #000000;">
},{
<span style="color: #800000;">"<span style="color: #800000;">$skip<span style="color: #800000;">":1<span style="color: #000000;">
}
)

{ : 1, : , : true, : 2, : , : false, : 3, : , : 4, : , : 5, : , : 6, : 7, : ,<span style="color: #008000;">#<span style="color: #008000;">下述操作时从users集合中随机选取3个文档
<span style="color: #000000;">db.users.aggregate(
[ { $sample: { size:
3<span style="color: #000000;"> } } ]
)

随机选取n个:$sample

练习题:

1查询岗位名以及各岗位内的员工姓名 2查询岗位名以及各岗位内包含的员工个数 3查询公司内男员工和女员工的个数 4查询岗位名以及各岗位的平均薪资、最高薪资、最低薪资 5查询男员工与男员工的平均薪资,女员工与女员工的平均薪资 6查询各岗位内包含的员工个数小于2的岗位名、岗位内包含员工名字、个数 7查询各岗位平均薪资大于10000的岗位名、平均工资 8查询各岗位平均薪资大于10000且小于20000的岗位名、平均工资 9查询所有员工信息,先按照age升序排序,如果age相同则按照hire_date降序排序 10查询各岗位平均薪资大于10000的岗位名、平均工资,结果按平均薪资升序排列 11. 查询各岗位平均薪资大于10000的岗位名、平均工资,结果按平均薪资降序排列,取前1个

1查询岗位名以及各岗位内的员工姓名 db.emp.aggregate({:{:,:{:2<span style="color: #000000;">. 查询岗位名以及各岗位内包含的员工个数
db.emp.aggregate({
<span style="color: #800000;">"
<span style="color: #800000;">$group
<span style="color: #800000;">"
:{<span style="color: #800000;">"
<span style="color: #800000;">_id
<span style="color: #800000;">"
:<span style="color: #800000;">"
<span style="color: #800000;">$post
<span style="color: #800000;">"
,<span style="color: #800000;">"
<span style="color: #800000;">count
<span style="color: #800000;">"
:{<span style="color: #800000;">"
<span style="color: #800000;">$sum
<span style="color: #800000;">"
:1<span style="color: #000000;">}}})

3<span style="color: #000000;">. 查询公司内男员工和女员工的个数
db.emp.aggregate({<span style="color: #800000;">"<span style="color: #800000;">$group<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$sex<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">count<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$sum<span style="color: #800000;">":1<span style="color: #000000;">}}})

4<span style="color: #000000;">. 查询岗位名以及各岗位的平均薪资、最高薪资、最低薪资
db.emp.aggregate({<span style="color: #800000;">"<span style="color: #800000;">$group<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$post<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">avg_salary<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$avg<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$salary<span style="color: #800000;">"},<span style="color: #800000;">"<span style="color: #800000;">min_salary<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$min<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$salary<span style="color: #800000;">"<span style="color: #000000;">}}})

5<span style="color: #000000;">. 查询男员工与男员工的平均薪资,女员工与女员工的平均薪资
db.emp.aggregate({<span style="color: #800000;">"<span style="color: #800000;">$group<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$sex<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">avg_salary<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$avg<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$salary<span style="color: #800000;">"<span style="color: #000000;">}}})

6<span style="color: #000000;">. 查询各岗位内包含的员工个数小于2的岗位名、岗位内包含员工名字、个数
db.emp.aggregate(
{
<span style="color: #800000;">"<span style="color: #800000;">$group<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$post<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">count<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$sum<span style="color: #800000;">":1},<span style="color: #800000;">"<span style="color: #800000;">names<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$push<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$name<span style="color: #800000;">"<span style="color: #000000;">}}
},{<span style="color: #800000;">"<span style="color: #800000;">$match<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">count<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$lt<span style="color: #800000;">":2<span style="color: #000000;">}}},{<span style="color: #800000;">"<span style="color: #800000;">$project<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":0,<span style="color: #800000;">"<span style="color: #800000;">names<span style="color: #800000;">":1,<span style="color: #800000;">"<span style="color: #800000;">count<span style="color: #800000;">":1<span style="color: #000000;">}}
)

7<span style="color: #000000;">. 查询各岗位平均薪资大于10000的岗位名、平均工资
db.emp.aggregate(
{
<span style="color: #800000;">"<span style="color: #800000;">$group<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$post<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">avg_salary<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$avg<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$salary<span style="color: #800000;">"<span style="color: #000000;">}}
},{<span style="color: #800000;">"<span style="color: #800000;">$match<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">avg_salary<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$gt<span style="color: #800000;">":10000<span style="color: #000000;">}}},{<span style="color: #800000;">"<span style="color: #800000;">$project<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":1,<span style="color: #800000;">"<span style="color: #800000;">avg_salary<span style="color: #800000;">":1<span style="color: #000000;">}}
)

8<span style="color: #000000;">. 查询各岗位平均薪资大于10000且小于20000的岗位名、平均工资
db.emp.aggregate(
{
<span style="color: #800000;">"<span style="color: #800000;">$group<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$post<span style="color: #800000;">",{<span style="color: #800000;">"<span style="color: #800000;">$match<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">avg_salary<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">$gt<span style="color: #800000;">":10000,<span style="color: #800000;">"<span style="color: #800000;">$lt<span style="color: #800000;">":20000<span style="color: #000000;">}}},<span style="color: #800000;">"<span style="color: #800000;">avg_salary<span style="color: #800000;">":1<span style="color: #000000;">}}
)

9<span style="color: #000000;">. 查询所有员工信息,先按照age升序排序,如果age相同则按照hire_date降序排序
db.emp.aggregate(
{<span style="color: #800000;">"<span style="color: #800000;">$sort<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">age<span style="color: #800000;">":1,<span style="color: #800000;">"<span style="color: #800000;">hire_date<span style="color: #800000;">":-1<span style="color: #000000;">}}
)

10<span style="color: #000000;">. 查询各岗位平均薪资大于10000的岗位名、平均工资,结果按平均薪资升序排列
db.emp.aggregate(
{
<span style="color: #800000;">"<span style="color: #800000;">$group<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$post<span style="color: #800000;">",{<span style="color: #800000;">"<span style="color: #800000;">$sort<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">avg_salary<span style="color: #800000;">":1<span style="color: #000000;">}}
)

11<span style="color: #000000;">. 查询各岗位平均薪资大于10000的岗位名、平均工资,取前1个
db.emp.aggregate(
{
<span style="color: #800000;">"<span style="color: #800000;">$group<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$post<span style="color: #800000;">",{<span style="color: #800000;">"<span style="color: #800000;">$sort<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">avg_salary<span style="color: #800000;">":-1<span style="color: #000000;">}},{<span style="color: #800000;">"<span style="color: #800000;">$limit<span style="color: #800000;">":1<span style="color: #000000;">},{<span style="color: #800000;">"<span style="color: #800000;">$project<span style="color: #800000;">":{<span style="color: #800000;">"<span style="color: #800000;">date<span style="color: #800000;">":new Date,<span style="color: #800000;">"<span style="color: #800000;">平均工资<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">$avg_salary<span style="color: #800000;">",<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">"<span style="color: #000000;">:0}}
)

六 可视化工具

七 pymongo

pymongo <span style="color: #008000;">#<span style="color: #008000;">1、链接
client=MongoClient(<span style="color: #800000;">'<span style="color: #800000;">mongodb://root:123@localhost:27017/<span style="color: #800000;">'<span style="color: #000000;">)
<span style="color: #008000;">#<span style="color: #008000;"> client = MongoClient('localhost',27017)

<span style="color: #008000;">#<span style="color: #008000;">2、use 数据库
db=client[<span style="color: #800000;">'<span style="color: #800000;">db2<span style="color: #800000;">'] <span style="color: #008000;">#<span style="color: #008000;">等同于:client.db1

<span style="color: #008000;">#<span style="color: #008000;">3、查看库下所有的集合
<span style="color: #0000ff;">print(db.collection_names(include_system_collections=<span style="color: #000000;">False))

<span style="color: #008000;">#<span style="color: #008000;">4、创建集合
table_user=db[<span style="color: #800000;">'<span style="color: #800000;">userinfo<span style="color: #800000;">'] <span style="color: #008000;">#<span style="color: #008000;">等同于:db.user

<span style="color: #008000;">#<span style="color: #008000;">5、插入文档
<span style="color: #0000ff;">import<span style="color: #000000;"> datetime
user0=<span style="color: #000000;">{
<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":1<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">name<span style="color: #800000;">":<span style="color: #800000;">"<span style="color: #800000;">egon<span style="color: #800000;">"<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">birth<span style="color: #800000;">"<span style="color: #000000;">:datetime.datetime.Now(),<span style="color: #800000;">'<span style="color: #800000;">city<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">BJ<span style="color: #800000;">'<span style="color: #000000;">
}
}

user1=<span style="color: #000000;">{
<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":2<span style="color: #000000;">,<span style="color: #800000;">'<span style="color: #800000;">city<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">weifang<span style="color: #800000;">'<span style="color: #000000;">
}
}
<span style="color: #008000;">#<span style="color: #008000;"> res=table_user.insert_many([user0,user1]).inserted_ids<span style="color: #008000;">

<span style="color: #008000;"> print(res)<span style="color: #008000;">

<span style="color: #008000;"> print(table_user.count())

<span style="color: #008000;">#<span style="color: #008000;">6、查找

<span style="color: #008000;">#<span style="color: #008000;"> from pprint import pprint#格式化细<span style="color: #008000;">

<span style="color: #008000;"> pprint(table_user.find_one())<span style="color: #008000;">

<span style="color: #008000;"> for item in table_user.find():<span style="color: #008000;">

<span style="color: #008000;"> pprint(item)

<span style="color: #008000;">#<span style="color: #008000;"> print(table_user.find_one({"_id":{"$gte":1},"name":'egon'}))

<span style="color: #008000;">#<span style="color: #008000;">7、更新
table_user.update({<span style="color: #800000;">'<span style="color: #800000;">_id<span style="color: #800000;">':1},{<span style="color: #800000;">'<span style="color: #800000;">name<span style="color: #800000;">':<span style="color: #800000;">'<span style="color: #800000;">EGON<span style="color: #800000;">'<span style="color: #000000;">})

<span style="color: #008000;">#<span style="color: #008000;">8、传入新的文档替换旧的文档
<span style="color: #000000;">table_user.save(
{
<span style="color: #800000;">"<span style="color: #800000;">_id<span style="color: #800000;">":2<span style="color: #000000;">,<span style="color: #800000;">"<span style="color: #800000;">name<span style="color: #800000;">":<span style="color: #800000;">'<span style="color: #800000;">egon_xxx<span style="color: #800000;">'<span style="color: #000000;">
}
)

dio controls="controls" style="display: none;">

相关文章

优化MySQL数据库发布系统存储的方法有:1.mysql库主从读写分...
使用mysql的方法:在“我的电脑”→右键→“管理”→“服务”...
在mysql中查看root用户权限的方法:1.命令行启动mysql服务;...
MySQL主从复制是用来备份一个与主数据库一样环境的从数据库,...
运行mysql的方法1.启动mysql服务,在“我的电脑”→右键→“...
开启mysql的方法1.可以通过快捷键win+r,输入cmd,打开窗口,...