type
status
password
date
slug
summary
category
URL
tags
icon
MongoDB简介
MongoDB 是一个基于分布式文件存储的 NoSQL 数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中的能最丰富,最像关系数据库的。
MongoDB 使用
BSON
(Binary JSON) 对象来存储,与 JSON
格式的键值对(key/value)类似,字段值可以包含其他文档,数组及文档数组。支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系型数据库单表查询的绝大部分功能,而且还支持对数据建立索引。与关系数据库的区别
SQL术语概念
| MongoDB术语概念 |
database(数据库)
| database(数据库) |
table (表) | collection(集合)
|
row(行) | document or BSON document (文档)
|
column(列)
| field(字段) |
index(索引) | index(索引)
|
table joins(表连接)
| embedded documents and linking(嵌入的文档和链接) |
primary key
primary key Specify any unique column or column combination as primary key.(指定任意唯一的列或列组合作为主键) | primary key
primary key in MongoDB, the primary key is automatically set to the _id field.(在MongoDB 中,主键被自动设置为_id字段) |
aggregation (e.g. group by) | MongoDB provides three ways to perform aggregation: the aggregation pipeline, the map-reduce function, and single purpose aggregation methods. (聚合操作) |
数据类型
数据类型 | 描述 |
String | 字符串。存储数据常用的数据类型。在MongoDB 中,UTF-8编码的字符申才是合法的。 |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为32位或 64位。 |
Boolean | 布尔值。用于存储布尔值(真/假)。 |
Double | 双精度浮点值。用于存储浮点值。 |
Min/Max keys | 将一个值与 BSON(二进制的JSON) 元素的最低值和最高值相对比。 |
Arrays | 用于将数组或列表或多个值存储为一个键。 |
Timestamp | 时间戳。记录文档修改或添加的具体时间。 |
Object | 用于内嵌文档。 |
Null | 用于创建空值。 |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date对象,传入年月日信息。 |
Object ID | 对象ID,用于创建文档的ID。 |
Binary Data | 二进制数据。用于存储二进制数据。 |
Code | 代码类型。用于在文档中存储 JavaScript代码。 |
Regular | 正则表达式类型。用于存储正则表达式。 |
用户管理
用户权限
权限 | 说明 |
read | 允许用户读取指定数据库。 |
readWrite | 允许用户读写指定数据库。 |
userAdmin | 允许用户向 system.users 集合写入,可以在指定数据库里创建、删除和管理用户。 |
dbAdmin | 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile。 |
clusterAdmin | 必须在 admin 数据库中定义,赋予用户所有分片和复制集相关函数的管理权限。 |
readAnyDatabase | 必须在 admin数据库中定义,赋予用户所有数据库的读权限。 |
readwriteAnyDatabase | 必须在 admin数据库中定义,赋予用户所有数据库的读写权限。 |
userAdminAnyDatabase | 必须在 admin数据库中定义,赋予用户所有数据库的 userAdmin 权限。 |
dbAdminAnyDatabase | 必须在 admin 数据库中定义,赋予用户所有数据库的 dbAdmin权限。 |
root | 必须在 admin数据库中定义,超级账号,超级权限。 |
创建管理用户
MongoDB 有一个用户管理机制,简单描述为管理用户组,这个组的用户是专门为管理普通用户而设的,暂且称之为管理员。管理员通常没有数据库的读写权限,只有操作用户的权限,我们只需要赋予管理员
userAdminAnyDatabase
角色即可。另外管理员账户必须在 admin
数据库下创建。
由于用户被创建在哪个数据库下,就只能在哪个数据库登录,所以把所有的用户都创建在 admin数据库下。这样我们切换数据库时就不需要频繁的进行登录了。
先
use admin
切换至 admin
数据库进行登录,登录后再 use 切换其他数据库进行操作即可。第二次的 use 就不需要再次登录了。MongoDB 设定 use 第二个数据库时如果登录用户权限比较高就可以直接操作第二个数据库,而不需要登录。创建步骤
- 切换数据库:管理员需要在 admin 数据库下创建,所以我们需要先切换至 admin 数据库。
- 查看用户:通过
db.system.users.find()
函数查看admin
数据库中的所有用户信息。
- 创建用户:在MongoDB 中可以使用
db.createUser
({用户信息})函数创建用户。 - user:用户名
- pwd:密码
- customData:存放用户相关的自定义数据,该属性也可忽略
- roles:数组类型,配置用户的权限
创建普通用户
需求:创建一个 test 数据库,给这个数据库添加一个用户,用户名为 testuser,密码为 123456。并授予该用户对 test数据库的读写操作权限。
- 管理员登录数据库
普通用户需要由管理员用户创建,所以先使用管理员用户登录数据库。
- 创建数据库
MongoDB 没有特定创建数据库的语法,在使用 use 切换数据库时,如果对应的数据库不存在则直接创建并切换。
- 创建用户
- 身份认证
打开一个新的客户端连接,切换至 test 数据库,执行文档插入语句,返回信息如下:
更新用户
更新角色
如果我们需要对已存在的用户进行角色修改,可以使用
db.updateUser()
函数来更新用户角色。注意:执行该函数需要当前用户具有 userAdmin
或 userAdminAnyDatabse
或 root
角色。
更新密码
使用
db.updateUser(”用户名”,{”pwd”:”新密码”})
函数更新密码
使用 db.changeUserPassword(”用户名”,”新密码”)
函数更新密码删除用户
通过
db.dropUser()
函数可以删除指定用户,删除成功以后会返回 true。删除用户时需要切换到该用户所在的数据库。注意:需要使用具有 userAdmin 或 userAdminAnyDatabse 或 root 角色的用户才可以删除其他用户。Database 操作
命令 | 作用 |
use | 切换指定数据库。
如果切换的数据库不存在,则创建该数据库。 |
db 命令 | 显示当前所在的数据库 |
show dbs 或者
show databases | 查看所有数据库。
不同角色看见的数据库不一样,管理员能看见所有的数据库,普通用户只能看见自己的数据库。
新创建数据库里面没有数据时通过 show dbs 或 show databases 是无法查看到的。需要向库中新增一个文档才能看见。 |
use mydb;
db.dropDatabase() | 删除数据库。删除数据库需要切换到需要删除的数据库中,且登录用户具有 dbAdmin 或 dbAdminAnyDatabase 或更高权限,执行 db.dropDatabase() 。 |
创建数据库
在 MongoDB 中创建数据库的命令使用的是
use
命令。该命令有两层含义:- 切换指定数据库。
- 如果切换的数据库不存在,则创建该数据库。
查询数据库
- 执行
db
命令可以显示当前所在的数据库。
- 若想查看所有数据库,可以通过
show dbs
或者show databases
命令查看。
不同角色看见的数据库不一样,管理员能看见所有的数据库,普通用户只能看见自己的数据库。
新创建数据库里面没有数据时通过 show dbs 或 show databases 是无法查看到的。需要向库中新增一个文档才能看见。
删除数据库
删除数据库需要切换到需要删除的数据库中,且登录用户具有
dbAdmin
或 dbAdminAnyDatabase
或更高权限,执行 db.dropDatabase()
。Collection 操作
MongoDB 中的集合是一组文档的集,相当于关系型数据库中的表。
命令 | 描述 |
db.createCollection("c1") | 创建集合 |
db.c2.insert({"a":1}) | 当第一个文档插入时,集合就会被创建并包合该文档
插入文档时如果没有指定 _id 则默认为 ObjectId 类型,_id 不能重复,且在插入后不可变。 |
db.c3 | 创建一个空集合,里面没有数据时通过 show tables 或 show collections 是无法查看到的。需要向集合中插入一个文档才能看见。 |
show tables 或
show collections | 查看所有集合 |
db.c1.stats() | 查看集合详情。 |
db.c1.drop() | 删除集合c1 |
创建集合
MongoDB 使用
db.createCollection()
函数来创建集合。- 语法格式:
db.createCollection(name, options)
。 name:要创建的集合名称。options:可选参数,指定有关内存大小及索引的选项。
字段 | 类型 | 描述 |
capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。 |
size | 数值 | (可选)限制集合空间的大小,默认为没有限制(以字节计)。如果 capped 为 true,必须指定该字段。 |
autoIndexId | 布尔 | (可选)如果为 true,自动在 _id 字段创建索引。默认为 true。 |
max | 数值 | (可选)限制集合中包含文档的最大数量,默认为没有限制。 |
查看集合
通过
show tables
或 show collections
查看所有集合。通过 db.COLLECTION_NAME.stats()
查看集合详情。删除集合
通过
db.COLLECTION_NAME.drop()
删除集合。Document 操作
命令 | 描述 |
db.c2.insert({"a":1}) | 当第一个文档插入时,集合就会被创建并包合该文档
插入文档时如果没有指定 _id 则默认为 ObjectId 类型,_id 不能重复,且在插入后不可变。 |
db.c1.insertOne({"name":"a"}) | 删除集合c1 |
db.c1.save({"name" :"a"}) | 如果不指定 _id 字段 save() 方法等同于 insert() 方法。如果指定 _id 字段,则变为更新文档的操作。 |
批量插入 | 1. db.c1.insert([{name:"a"}, {name:"b"}])
2. db.c1.insertMany([{name:"a"},{name:"b"}])
3. db.c1.save([{name:"a"}, {name:"b"}]) |
db.c1.update(query, update, options) | 更新操作 |
db.c1.remove(<query>, {justOne: <boolean>}) | query:(可选)删除的文档的条件。如果没有那么删除所有数据
Justone:(可选)如果设为 true,则只删除一个文档; False删余所有匹配的数据 |
插入文档
单条插入
可以使用
insert/insertOne/save
插入单条文档:db.c1.insert({"name":"a"})
:插入文档时如果没有指定_id
则默认为ObjectId
类型,_id
不能重复,且在插入后不可变。
db.c1.insertOne({"name":"a"})
db.c1.save({"name" :"a"})
:如果不指定_id
字段 save() 方法等同于 insert() 方法。如果指定_id
字段,则变为更新文档的操作。
批量插入
可以使用
insert/insertMany/save
插入多条文档。区别在于把单条插入时函数参数的对象类型{}
变成数组类型[{}, {}]
db.c1.insert([{name:"a"}, {name:"b"}])
db.c1.insertMany([{name:"a"},{name:"b"}])
db.c1.save([{name:"a"}, {name:"b"}])
更新文档
update、save函数
通过
update
系列函数或者 save
函数可以更新集合中的文档。我们来详细看下 update
函数的使用,上一节已经介绍过 save
函数。update()
函数用于更新已存在的文档。语法格式如下:- query:update 的查询条件,类似 SQL update 语句中的 where 部分。
- update:update 的对象和一些更新的操作符(如 $set, $inc.) 等,也可以理解为 SQL update 语句中的 set部分。
- upsert:可选,如果不存在 update 的文档,是否插入该文档。true 为插入,默认是 false,不插入。
- multi:可选,是否批量更新。true 表示按条件查询出来的多条记录全部更新,false 只更新找到的第一条记录,默认是 false。
注意:更新文档是更新整个文档的操作,如果修改的值只有 name 和 age,除了_id 以外其他属性将会被删除。
更新操作符
操作符 | 作用 |
$set | 用来指定—个键并更新键值,若键不存在并创建。 |
$inc | 可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作。 |
$unset | 主要是用来删除键。 |
$push
| 向文档的某个数组类型的键添加一个数组元素,不过滤重复的数据。添加时键存在,要求键值类型必须是数组;键不存在,则创建数组类型的键。 |
$pop | 删除数据元索。1 表示从数组的尾部删除,1 表示从数组的头部删除元素 |
$pull | 从数组中删除满足条件的元素 |
$pullAll | 从数组中删除满足条件的多个元素 |
$rename | 对键进行重新命名。 |
删除文档
通过
remove()
函数是用来移除集合中的数据,其语法格式如下所示:- query:(可选)删除的文档的条件。
- Justone:(可选)如果设为 true,则只删除一个文档,False删余所有匹配的数据
查询文档
查询所有
如果你需要以易读的方式来读取数据,可以使用 pretty()
运算
比较
逻辑
MongoDB中字典内用逗号分隔多个条件是and关系,或者直接用 $and, $or,$not (与或非)
成员
成员运算无非in和not in, MongoDB中形式为
$in
、$nin
$type
MongoDB中可以使用的类型如下表所示:
类型 | 数字 | 备注 |
Double | 1 | ㅤ |
String | 2 | ㅤ |
Object | 3 | ㅤ |
Array | 4 | ㅤ |
Binary data | 5 | ㅤ |
Undefined | 6 | 已废弃 |
Object id | 7 | ㅤ |
Boolean | 8 | ㅤ |
Date | 9 | ㅤ |
Null | 10 | ㅤ |
Regular Expression | 11 | ㅤ |
JavaScript | 13 | ㅤ |
Symbol | 14 | ㅤ |
JavaScript (with scope) | 15 | ㅤ |
32-bit integer | 16 | ㅤ |
Timestamp | 17 | ㅤ |
64-bit integer | 18 | Query with -1 |
Min key | 255 | ㅤ |
Max key | 127 | ㅤ |
正则化
正则定义在
/ /
内投影
在MongoDB中,当执行 find() 方法,那么它会显示一个文档所有字段。要限制这一点,需要设置的字段列表值1或0。
1用来显示字段而0是用来隐藏字段,
_id
会默认显示出来。数组
排序
在MongoDB中使用使用
sort()
方法对数据进行排序,sort()
方法可以通过参数指定排序的字段,并使用1和-1来指定排序的方式,其中1为升序排列,而-1是用于降序排列分页
limit表示取多少个document, skip代表跳过几个document分页公式如下:
db.user.find().skip( (pageNum-1)*pagesize ).limit(pagesize)
统计
聚合
我们在查询时肯定会用到聚合,在MongoDB中聚合为aggregate,聚合函数主要用到
$match
,$group
, $avg
, $project
, $concat
,可以加 $match
也可以不加 $match
表达式 | 描述 |
$sum | 计算总和。 |
$avg | 计算平均值 |
$min | 获取集合中所有文档对应值得最小值。 |
$max | 获取集合中所有文档对应值得最大值。 |
$push | 在结果文档中插入值到一个数组中。 |
$addToSet | 在结果文档中插入值到一个数组中,但不创建副本 |
$first | 根据资源文档的排序获取第一个文档数据。 |
$last | 根据资源文档的排序茯取最后一个文档数据 |
Aggregate语法
基本格式:
db.collection.aggregate(pipeline, options)
- pipeline:一系列数据聚合操作或阶段。在版本2.6中更改:该方法仍然可以将流水线阶段作为单独的参数接受,而不是作为数组中的元素;但是,如果不将管道指定为数组,则不能指定options参数。目前所使用的4.0.4版本必须使用数组。
- options:可选。aggregate()传递给聚合命令的其他选项。2.6版中的新增功能:仅当将管道指定为数组时才可用。
注意:使用
db.collection.aggregate()
直接查询会提示错误,但是传一个空数组如db.collection.aggregate([])
则不会报错,且会和find一样返回所有文档。$match和$group: 相当于sql语句中的where和group by
$project
用于投射,即设定该键值对是否保留。1为保留,0为不保留,可对原有键值对做操作后增加自定义表达式(查询哪些要显示的列)
$sort和$limit和$skip
$sample
随机选取n个:$sample
$concat和$substr和$toLower和$toUpper
索引
创建索引
索引通常能够极大的提高查询的效率,MongoDB使用 ensurelndex() 方法来创建索引,其基本语法格式如下所示:
db.COLLECTION_NAME.ensureIndex({KEY:1})
- key:创建的索引字段,1为指定按升序创建索引,-1则为按降序来创建索引。
ensureIndex()
接收可选参数,可选参数列表如下:Type | Description | ㅤ |
background | Boolean | 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引。即增加”background”可选参数,background 默认值为faise. |
unique | Boolean | 建立的索引是否唯一。指定为true创建唯一索引,默认值为false |
name | string | 索引的名你,如果未指定,MongoDB会通过连接索引的字段名和排序顺序生成一个名称。 |
dropDups | Boolean | 在建立唯一索引时,是否删除重复记录。指定true创建唯一索引,默认值为 false |
sparse | Boolean | 对文档中不存在的字段数据不启用索引。这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含该字段的文档,默认值为false |
expreAfterSeconds | integer | 指定一个以秒力单位的数值,完成TTL设定,设定集合的生存时间, |
v | ㅤ | 索引的版本号,默认的索引版本取决于mongod创建索引时运行的版本 |
weights | document | 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分仅重。 |
default_language | string | 对于文本索引,该字段决定了停用词及词干和词器的规则和列表。默认为英语 |
language _override | string | 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为language |
查询索引
查询索引的语法格式如下所示:
db.COLLECTION_ NAME.getIndexes()
删除索引
删除索引的语法格式如下所示:
db.COLLECTION_NAME.droplindex(INDEX_NAME)