MongoDB快速上手——从0到1入门
目录
MongoDB简介
MongoDB
是一个开源、高性能、无模式的文档型数据库(C++语言编写),特点是
高性能、易部署、易使用
,当初的设计就是用于简化开发和方便扩展,是
NoSQL
数据库产品中的一种。是最像关系型数据库(MySQL)的非关系型数据库。
应用场景:
- 数据量大
- 写入操作频繁(读写都很频繁)
- 价值较低的数据,对事务性要求不高
NoSQL与SQL区别和联系
NoSQL(Not Only SQL ),意即“不仅仅是SQL” ,指的是非关系型的数据库,它们不保证关系数据的ACID特性 ,是一项全新的数据库革命性运动,NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
关系型数据库中的表都是存储一些结构化的数据,每条记录的字段的组成都一样,即使不是每条记录都需要所有的字段,但数据库会为每条数据分配所有的字段。而NoSQL数据库种类繁多,而且一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。无形之间也在架构的层面上带来了可扩展的能力。大数据量,高性能,NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单
NoSQL优点:
- 高扩展性;
- 高可用,高性能;
- 灵活的数据类型;
NoSQL分类:
- key-value键值存储数据库;
- 列存储数据库
- 文档型数据库
- Graph图形数据库
常见的NoSQL数据库:
MongoDB、DynamoDB、SimpleDB、CouchDB、CouchBase、OrientDB、InfiniteGraph、Neo4j、FlockDB、Cassandra、以及HBase等。
MangoDB安装和配置
第一步:下载安装包
MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoDB 预编译二进制包下载地址:
https://www.mongodb.com/download-center#community
根据上图所示下载 zip 包。
版本的选择:
MongoDB的版本命名规范如:x.y.z
y为奇数时表示当前版本为开发版,如:1.5.2、4.1.13;
y为偶数时表示当前版本为稳定版,如:1.6.3、4.0.10;
z是修正版本号,数字越大越好。
详情:http://docs.mongodb.org/manual/release-notes/#release-version-numbers
第二步:解压安装启动
将压缩包解压到一个目录中。
在解压目录中,手动建立一个目录用于存放数据文件,如 data/db;
方式1:命令行参数方式启动服务
在 bin 目录中打开命令行提示符,输入如下命令:
mongod --dbpath=..\data\db
我们在启动信息中可以看到,mongoDB的默认端口是27017,如果我们想改变默认的启动端口,可以通过–port来指定端口。为了方便我们每次启动,可以将安装目录的bin目录设置到环境变量的path中, bin 目录下是一些常用命令,比如 mongod 启动服务用的,mongo 客户端连接服务用的。
方式2:配置文件方式启动服务
在解压目录中新建 config 文件夹,该文件夹中新建配置文件 mongod.conf ,内如参考如下:
storage:
#The directory where the mongod instance stores its data.Default Value is "\data\db" on Windows.
dbPath: D:\02_Server\DBServer\mongodb-win32-x86_64-2008plus-ssl-4.0.1\data
详情可参考:https://docs.mongodb.com/manual/reference/configuration-options/
启动方式:
mongod -f ../config/mongod.conf
或
mongod --config ../config/mongod.conf
更多参数配置:
systemLog:destination: file
#The path of the log file to which mongod or mongos should send all diagnostic logging informationpath:"D:/02_Server/DBServer/mongodb-win32-x86_64-2008plus-ssl-4.0.1/log/mongod.log"logAppend:truestorage:journal:enabled:true#The directory where the mongod instance stores its data.Default Value is "/data/db". dbPath:"D:/02_Server/DBServer/mongodb-win32-x86_64-2008plus-ssl-4.0.1/data"net:#bindIp: 127.0.0.1 port:27017setParameter:enableLocalhostAuthBypass:false
Shell连接
在命令提示符输入以下shell命令即可完成登陆:
mongo
或
mongo --host=127.0.0.1 --port=27017
Linux中的安装启动和连接
提示:和Windows下操作大同小异
步骤如下:
(1)先到官网下载压缩包 mongod-linux-x86_64-4.0.10.tgz 。
可以用uname指令查看自己Linux操作系统位数
(2)上传压缩包到Linux中,解压到当前目录:
tar -xvf mongodb-linux-x86_64-4.0.10.tgz
(3)移动解压后的文件夹到指定的目录中:
mv mongodb-linux-x86_64-4.0.10 /usr/local/mongodb
(4)新建几个目录,分别用来存储数据和日志:
#数据存储目录 mkdir -p /mongodb/single/data/db
#日志存储目录 mkdir -p /mongodb/single/log
(5)新建并修改配置文件
vi /mongodb/single/mongod.conf
配置文件的内容如下:
systemLog:#MongoDB发送所有日志输出的目标指定为文件 ##The path of the log file to which mongod or mongos should send all diagnostic logging information destination: file
#mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径 path:"/mongodb/single/log/mongod.log"#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。 logAppend:truestorage:#mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。 ##The directory where the mongod instance stores its data.Default Value is "/data/db". dbPath:"/mongodb/single/data/db"journal:#启用或禁用持久性日志以确保数据文件保持有效和可恢复。 enabled:trueprocessManagement:#启用在后台运行mongos或mongod进程的守护进程模式。 fork:truenet:#服务实例绑定的IP,默认是localhost bindIp: localhost,192.168.0.2
#bindIp #绑定的端口,默认是27017 port:27017
(6)启动MongoDB服务
/usr/local/mongodb/bin/mongod -f /mongodb/single/mongod.conf
注意: 如果启动后不是 successfully ,则是启动失败了。原因基本上就是配置文件有问题。
通过进程来查看服务是否启动了:
ps -ef |grep mongod
(7)分别使用mongo命令和compass(图形化)工具来连接测试。
提示:如果远程连接,需要配置防火墙放行,或直接关闭linux防火墙
#查看防火墙状态
systemctl status firewalld
#临时关闭防火墙
systemctl stop firewalld
#开机禁止启动防火墙
systemctl disable firewalld
(7)停止关闭服务
#客户端登录服务,注意,这里通过localhost登录,如果需要远程登录,必须先登录认证才行。
mongo --port 27017#切换到admin库
use admin
#关闭服务
db.shutdownServer()
【补充】 如果一旦是因为数据损坏,则需要进行如下操作:
1)删除lock文件:
rm -f /mongodb/single/data/db/*.lock
2)修复数据:
/usr/local/mongdb/bin/mongod --repair --dbpath=/mongodb/single/data/db
基本命令
查看当前可以使用的库:
show dbs
或
show databases
演示:
创建数据库:
use 数据库名称
演示:
提示:此时虽然创建了该库,但是先存在内存中,未进行持久化操作,故此时是查询不到的
查看当前使用的库:
db
演示:
删除数据库:
db.dropDatabase()
提示:主要用来删除已经持久化的数据库
集合(Collection)CRUD操作
MongoDB中的集合,类似关系型数据库中的表。
与Mysql中的术语联系与区别如下图所示:
增(Create)
显示创建:
db.createCollection(name)
集合的命名规范:
- 集合名不能是空字符串""。
- 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
- 集合名不能以"system."开头,这是为系统集合保留的前缀。
- 用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除 非你要访问这种系统创建的集合,否则千万不要在名字里出现$。
演示:
隐式创建:
当向一个集合中插入一个文档的时候,如果集合不存在,则会自动创建集合。
通常我们使用隐式创建文档即可
删(Delete)
集合删除语法格式如下:
db.collection.drop()
或
db.集合.drop()
获取集合删除的返回值:
如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。
db.mycollection.drop()
演示:
改(Update)
修改集合名:
db.旧集合名.renameCollection(new_name)
演示:
更新Collection中的数据字段:
db.集合名.updateMany({},{$rename:{"旧字段名":”新字段名“}})
或
db.getCollection("集合名").update({},{\$rename:{"旧字段名":”新字段名“}},false,true)
查((Retrieve))
查看当前库中的集合:show tables命令
show collections
或
show tables
文档(Document)CRUD操作
基本命令
文档(document)的数据结构和 JSON 基本一样。
所有存储在集合中的数据都是 BSON 格式。
单个文档的插入:
使用insert() 或 save() 方法向集合中插入文档,语法如下:
db.collection.insert(<document or array of documents>,
{ writeConcern: <document>,
ordered: <boolean>})
参数:
提示:
1)comment集合如果不存在,则会隐式创建
2)mongo中的数字,默认情况下是double类型,如果要存整型,必须使用函数NumberInt(整型数字),否则取出来就有问题了。
3)插入当前日期使用 new Date() 4)插入的数据没有指定 _id ,会自动生成主键值
5)如果某字段没值,可以赋值为null,或不写该字段。
演示:
注意:
- 文档中的键/值对是有序的。
- 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。 3. MongoDB区分类型和大小写。
- MongoDB的文档不能有重复的键。
- 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
文档键命名规范:
- 键不能含有\0 (空字符)。这个字符用来表示键的结尾。
- .和$有特别的意义,只有在特定环境下才能使用。
- 以下划线"_"开头的键是保留的(不是严格要求的)。
批量查询:
db.collection.insertMany([<document 1> , <document 2>, ... ],
{ writeConcern: <document>,
ordered: <boolean>}
参数:
示例:
提示:
- 插入时指定了 _id ,则主键就是该值。
- 如果某条数据插入失败,将会终止插入,但已经插入成功的数据不会回滚掉。
- 因为批量插入由于数据较多容易出现失败,因此,可以使用try catch进行异常捕捉处理,测试的时候可以不处理。
示例:
基本查询
统计查询
db.collection.count(query, options)
参数:
示例:
分页查询
可以使用limit()方法来读取指定数量的数据,使用skip()方法来跳过指定数量的数据。
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
- 如果你想返回指定条数的记录,可以在find方法后调用limit来返回结果(TopN),默认值20
- skip方法同样接受一个数字参数作为跳过的记录条数。(前N个不要),默认值是0
示例:
排序查询
sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用
于降序排列。
db.COLLECTION_NAME.find().sort({KEY:1})
或
db.集合名称.find().sort(排序方式)
提示: skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit(),和命令编写顺序无关。
示例:
正则复杂条件查询
MongoDB的模糊查询是通过正则表达式的方式实现的。格式为:
db.collection.find({field:/正则表达式/})
或
db.集合.find({字段:/正则表达式/})
提示:正则表达式是js的语法,直接量的写法。
示例:
比较查询
比较这个操作符也是很常用的,格式如下:
db.集合名称.find({"field":{$gt: value }}) // 大于: field > value
db.集合名称.find({"field":{$lt: value }}) // 小于: field < value
db.集合名称.find({"field":{$gte: value }}) // 大于等于: field >= value
db.集合名称.find({"field":{$lte: value }}) // 小于等于: field <= value
db.集合名称.find({"field":{$ne: value }}) // 不等于: field != value
示例:
包含查询
包含使用$in操作符,不包含使用$nin操作符。
db.comment.find({字段名:{$in:["值","值"]}})
示例:
条件连接查询
我们如果需要查询同时满足两个以上条件,需要使用、
$逻辑操作符
($and、$or)操作符将条件进行关联。格式为:
$and:[{},{},{}]
或
$or:[{},{},{}]
示例:
索引
索引
支持在MongoDB中高效地执行查询。如果没有索引,MongoDB必须执行全集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
说明:MongoDB索引使用B树数据结构(确切的说是B-Tree,MySQL是B+Tree)
单字段索引
MongoDB支持在文档的单个字段上创建用户定义的升序/降序索引,称为单字段索引(Single Field Index)。
对于单个字段索引和排序操作,索引键的排序顺序(即升序或降序)并不重要,因为MongoDB可以在任何方向上遍历索引。
复合索引
MongoDB还支持多个字段的用户定义索引,即复合索引(Compound Index)。
复合索引中列出的字段顺序具有重要意义。例如,如果复合索引由 { userid: 1, score: -1 } 组成,则索引首先按userid正序排序,然后
在每个userid的值内,再在按score倒序排序。
其他索引
地理空间索引(Geospatial Index)、文本索引(Text Indexes)、哈希索引(Hashed Indexes)等等。
tips:篇幅有限,索引相关的CRUD操作,以及MongoDB的集群、分片以及安全认证等,留给大家自己探索
结语
上述过程,我们从0到1的从MongoDB的安装和配置,以及数据库、集合、文档的简单CRUD操作,让我们了解的MongoDB数据库的简单指令,简单的入门了MongoDB,可以实现基本的CRUD操作了,但是MongoDB还有很多操作,而且,现在分布式,微服务活跃的今天,MongoDB必将也会有一席之地,入手一下MongoDB,绝对不会后悔。
微语:不要活在虚妄的过去,不要为曾经做过太多假设,往事不回头,余生不讲究。
版权归原作者 一问30 所有, 如有侵权,请联系我们删除。