MongoDB大神学习之路
一. 什么是MongoDB
MongoDB是由C++语言编写的,是一个基于分布式存储的数据库。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。MongoDB最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
所谓关系型数据库:就是指由二维表及其之间的联系组成的一个数据组织。
所谓分布式存储:是将数据分散存储在多台独立的设备上。
MongoDB 更类似 Mysql,支持字段索引、游标操作,其优势在于查询功能比较强大,擅长查询 JSON 数据,能存储海量数据,但是不支持事务。
Mysql 在大数据量时效率显著下降,MongoDB 更多时候作为关系数据库的一种替代。
二. MongoDB支持的数据类型
- 字符串 String - 这是用于存储数据的最常用的数据类型。MongoDB 中的字符串必须为UTF-8。
- 整型 Integer- 此类型用于存储数值。 整数可以是 32 位或 64 位,具体取决于服务器。
- 布尔类型 Boolean - 此类型用于存储布尔值(true / false)值。
- 双精度浮点数 Double - 此类型用于存储浮点值。
- 最小/最大键 Min/ Max keys - 此类型用于将值与最小和最大 BSON 元素进行比较。
- 数组 Arrays - 此类型用于将数组或列表或多个值存储到一个键中。
- 时间戳 Timestamp - 当文档被修改或添加时,可以方便地进行录制。
- 对象 Object - 此数据类型用于嵌入式文档。
- Null - 此类型用于存储 Null 值。
- 符号 Symbol - 该数据类型与字符串相同; 但是,通常保留用于使用特定符号类型的语言。
- 日期 Date- 此数据类型用于以 UNIX 时间格式存储当前日期或时间。您可以通过创建日期对象并将日,月,年的日期进行指定自己需要的日期时间。
- 对象 ID Object ID - 此数据类型用于存储文档的 ID。
- 二进制数据 Binary data - 此数据类型用于存储二进制数据。
- 代码 Code - 此数据类型用于将 JavaScript 代码存储到文档中。
- 正则表达式 Regular expression - 此数据类型用于存储正则表达式。
- 内存管理机制
三. MongoDB和Redis的区别
Redis 数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的 LRU 算法删除数据。
MongoDB 数据存在内存,由 linux 系统 mmap 实现,当内存不够时,只将热点数据放入内存,其他数据存在磁盘。
- 支持的数据结构
Redis 支持的数据结构丰富,包括 String、hash、list、set、sorted set 等。
MongoDB 数据结构比较单一,但是支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富。
- 性能
二者性能都比较高。
- 可靠性
二者均支持持久化。
- 集群
MongoDB 集群技术比较成熟,Redis 从 3.0 开始支持集群。
- 不适用场景
需要使用复杂 sql 的操作
事务性系统
四. 安装 MongoDB
- 下载地址:https://www.mongodb.com/download-center/community
- 上传至服务器
- 解压
- 重命名和移动
- 配置环境变量
- 创建数据,日志文件
- mongoDB 启动配置:在bin目录下加配置文件-->MongoDB.conf
- 基本配置:quiet--> # 安静输出;port arg --># 指定服务端口号,默认端口;27017;bind_ip arg--># 绑定服务 IP,若绑定 127.0.0.1,则只能本机访
问,不指定默认本地所有 IP;logpath arg--># 指定 MongoDB 日志文件,注意是指定文件不是目录;logappend --># 使用追加的方式写日志;
pidfilepath arg--># PID File 的完整路径,如果没有设置,则没有 PID
文件;--keyFile arg--># 集群的私钥的完整路径,只对于 Replica Set 架构
有效;unixSocketPrefix arg --># UNIX 域套接字替代目录,(默认为 /tmp);
fork--># 以守护进程的方式运行 MongoDB,创建服务器进程;auth --># 启用验证;cpu --># 定期显示 CPU 的 CPU 利用率和 iowait;dbpath arg--> # 指定数据库路径;diaglog arg--># diaglog 选项 0=off 1=W 2=R 3=both 7=W+some reads;directoryperdb--> # 设置每个数据库将被保存在一个单独的目录;journal--># 启用日志选项,MongoDB 的数据操作将会写入到journal 文件夹的文件里;journalOptions arg --># 启用日志诊断选项;ipv6 --># 启用 IPv6 选项;jsonp --># 允许 JSONP 形式通过 HTTP 访问(有安全影响);maxConns arg--> # 最大同时连接数 默认 2000;noauth --># 不启用验证;nohttpinterface--># 关闭 http 接口,默认关闭 27018 端口访问;noprealloc --># 禁用数据文件预分配(往往影响性能);noscripting --># 禁用脚本引擎;notablescan --># 不允许表扫描;nounixsocket--> # 禁用 Unix 套接字监听;nssize arg (=16)--> # 设置信数据库.ns 文件大小(MB);objcheck--> # 在收到客户数据,检查的有效性;profile arg--> # 档案参数 0=off 1=slow, 2=all;quota --># 限制每个数据库的文件数,设置默认为 8;quotaFiles arg--> # number of files allower per db, requires --quota;rest--> # 开启简单的 rest ;API--repair--> # 修复所有数据库 run repair on all dbs;repairpath arg--> # 修复库生成的文件的目录,默认为目录名称 dbpath;slowms arg (=100)--> # value of slow for profile and console log;smallfiles--> # 使用较小的默认文件;syncdelay arg (=60) --># 数据写入磁盘的时间秒数(0=never,不推荐);sysinfo--> # 打印一些诊断系统信息;upgrade --># 如果需要升级数.
- 启动配置文件
进入bin目录中 ./mongod -f mongodb.conf进行启动
- 连接 mongodb 数据库
进入bin目录中 ./mongo 进行连接
- 设置权限:chmod 754 filename 命令意思是将 filename 文件的读写运行权限赋予文件所有者,把读和运行的权限赋予群组用户,把读的权限赋予其他用户.
- 下载安装Robomongo:https://robomongo.org/download
- 连接数据库并进行测试
- 数据库用户角色:read、readWrite;
- 数据库管理角色:dbAdmin、dbOwner、userAdmin;
- 集群管理角色:clusterAdmin、clusterManage、clusterMonitor、hostManager;
- 备份恢复角色:backup、restore;
- 所 有 数 据 库 角 色 : readAnyDatabase 、 readWriteAnyDatabase 、userAdminAnyDatabase、dbAdminAnyDatabase
- 超级用户角色:root
- 内部角色:__syst
五. 安装可视化操作工具
六. MongoDB内置角色说明
七. 操作数据库
- 创建数据库:一个 mongodb 中可以建立多个数据库。MongoDB 的默认数据库为"db",该数据库存储在 data 目录中。MongoDB 创建数据库的语法格式如下:
use DATABASE_NAME
> use shsxt
switched to db shsxt
> db
Shsxt
注:如果数据库不存在,则创建数据库,否则切换到指定数据库中,空的数据库是不显示的.
- 查询数据库:执行 "db" 命令可以显示当前数据库对象或集合,若想想查看所有数据库,可以使用show dbs 命令.
- 删除数据库:MongoDB 删除数据库的语法格式如下:默认删除当前数据库,你可以使用 db 命令查看当前数据库名。
db.dropDatabase()
> db
shsxt
> db.dropDatabase()
{ "dropped" : "shsxt", "ok" : 1 }
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
八. 操作集合
- 创建集合:db.createCollection(name, {capped: <Boolean>, autoIndexId: <Boolean>, size: <number>, max <number>})
name 是要创建的集合的名称;
options 是一个文件,用于指定配置的集合。
name: 是要创建的集合的名称capped: 是否启用集合限制,如果开启需要制定一个限制条件,默认为不启用,这个参数没有实际意义.
size: 限制集合使用空间的大小,默认为没有限制max: 集合中最大条数限制,默认为没有限制.
autoIndexId: 是否使用_id 作为索引,默认为使用(true 或 false)size 的优先级比 max 要高.
- 删除集合:db.COLLECTION_NAME.drop()
> db.shsxt.drop()
true
> show collections
>
九. 操作文档
- 插入文档:
1.1. insert()
user0 = {
"name":"zhangsan",
"age":18,
"hobbies":["music", "read"],
"addr":{
"country":"China",
"city":"BJ"
}
}
db.user.insert(user0)
注:_id 字段,这个值必须在 user 集合中唯一,若不指定主键值,会自动分配一个值。
1.2. save()
user1 = {
"_id":"2",
"name":"lisi",
"age":20,
"hobbies":["music", "read"],
"addr":{
"country":"China",
"city":"BJ"
}
}
db.user.save(user1)
1.3. 批量插入时,只需要修改最后一个命令即可:db.user.insertMany([user1, user2, user3, user4, user5])
2. 更新文档
MongoDB 使用 update() 和 save() 方法来更新集合中的文档,我们详细来看下update 的应用,上一节已经介绍过 save()方法。update() 方法用于更新已存在的文档。
语法格式如下:db.collection.update(criteria, objNew, upsert, multi)
参数说明:
· criteria : update 的查询条件,类似 sql update 查询内 where 后面的。
· objNew : update 的对象和一些更新的操作符(如$,$inc...)等,也可以理解为 sql update 查询内 set 后面的.
upsert : 这个参数的意思是,如果不存在 update 的记录,是否插入 objNew,true为插入,默认是 false,不插入。
· multi : mongodb 默认是 false,只更新找到的第一条记录,如果这个参数为 true,就把按条件查出来多条记录全部更新。
3.删除文档
MongoDB remove()函数是用来移除集合中的数据,其语法格式如下所示:
db.user.remove(<query>, {justOne: <boolean>})
参数说明:
query:(可选)删除的文档的条件。
justOne :(可选)如果设为 true,则只删除一个文档,False 删除所有匹配的数据等价于db.user.deleteOne(<query>):删除符合条件的第一个文档.
删除所有数据命令:
db.user.remove({})
等价于
db.user.deleteMany({}) # 等于是清空该集合(表)
4.查询文档
查询所有
MongoDB 查询数据的语法格式如下:
db.user.find() # 等同于 db.user.find({})
# 去重
db.user.distinct('name')
find() 方法以非结构化的方式来显示所有文档。
如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:
db.user.find().pretty()
pretty() 方法以格式化的方式来显示所有文档
注:在 MongoDB 中,用到方法都得用 $ 符号开头
5.运算
5.1 比较运算
=,!= ('$ne') ,> ('$gt') ,< ('$lt') ,>= ('$gte') ,<= ('$lte’)
5.2 逻辑运算
MongoDB 中字典内用逗号分隔多个条件是 and 关系,或者直接用$and,$or,$not(与或非)
5.3 成员运算
成员运算无非 in 和 not in,MongoDB 中形式为$in , $nin
5.4 $type 操作符
5.5 正则定义在/ /内
5.6 投影:MongoDB 投影意思是只选择必要的数据而不是选择一整个文件的数据。 在 MongoDB 中,当执行 find()方法,那么它会显示一个文档所有字段。要限制这一点,需要设置的字段列表值 1 或 0。1 用来显示字段而 0 是用来隐藏字段,_id 会默认显示出来.
5.7 数组
5.8 排序:在 MongoDB 中使用使用 sort()方法对数据进行排序,sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1 是用于降序排序.
5.9 分页:limit 表示取多少个 document,skip 代表跳过几个 document分页公式:db.user.find().skip((pageNum–1)*pageSize).limit(pageSize);
db.user.find().limit(2).skip(0) # 前两个
db.user.find().limit(2).skip(2) # 第三个和第四个
db.user.find().limit(2).skip(4) # 第五个和第六个
5.10 统计:# 查询_id 大于 3 的人数
# 方式一db.user.count({'_id':{"$gt":3}})
# 方式二db.user.find({_id:{"$gt":3}}).count()
6.聚合:我们在查询时肯定会用到聚合,在 MongoDB 中聚合为 aggregate,聚合函数主要用到$match $group $avg $project $concat,可以加"$match"也可以不加$match
来源:https://www.cnblogs.com/ruanjianwei/p/12133339.html