MongoDB 是一个基于分布式文件存储的半结构化的非关系型数据库。在海量数据中,能够较高性能的处理存取操做。它是以 BSON 格式进行数据存储(相似 JSON 格式,但类型更为丰富),所以对于复杂的数据类型,能够较轻松的保存和处理。同时,在非关系型数据库阵容中,相比其余数据库产品,它拥有更丰富的功能,而且与关系型数据库类型,因此对于新手使用也能快速上手。linux
环境:CentOS 7 版本号:4.2.6 企业版 版本:免安版(TGZ)web
访问官网连接下载连接:www.mongodb.com/download-ce…redis
我这里使用的是企业版,下载选项如图:mongodb
下载后获得压缩包 mongodb-linux-x86_64-enterprise-rhel70-4.2.6.tgz数据库
将下载的压缩包上传至对应目录,而后进行解压数组
> tar -zxvf mongodb-linux-x86_64-enterprise-rhel70-4.2.6.tgz
复制代码
当前使用的是免安版,因此 mongoDB 的配置文件须要本身手动建立。若是使用的是安装版,安装后配置文件会在 /etc/mongod.conf 中。bash
建立配置前,先建立 data、log、run 三个目录,分别对应的数据存储目录、日志目录、进程 ID 保存目录websocket
> mkdir -p /var/mongodb/data
> mkdir -p /var/mongodb/log
> mkdir -p /var/mongodb/run
复制代码
建立 mongod.conf 在 /var/mongodb 目录中,内容以下:负载均衡
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /var/mongodb/log/mongo.log # 日志文件路径设置
# Where and how to store data.
storage:
dbPath: /var/mongodb/data # 数据存储路径
journal:
enabled: true
# engine:
# wiredTiger:
# how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /var/mongodb/run/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
port: 27017 # 端口号
bindIp: 127.0.0.1 # 监听 IP ,便可访问 IP,默认是本机
security:
authorization: enabled
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options
#auditLog:
#snmp:
复制代码
配置文件经常使用基本属性:socket
属性 | 说明 |
---|---|
systemLog#destination | 日志输出位置,file 或 syslog,使用 file 时,必须指定 path |
systemLog#logAppend | 当实例启动时日志是否追加写入到现有日志中 |
systemLog#path | 日志存放路径 |
storage#dbPath | 数据存储路径 |
storage#journal#enabled | 日志是否永久性,能够用来恢复数据 |
processManagement#fork | 是否后台运行服务 |
processManagement#pidFilePath | pid 文件的存储路径 |
processManagement#timeZoneInfo | 数据库使用的时区路径 |
net#port | 数据使用的端口 |
net#bindIp | 监听客户端链接的 IP,便可访问的 IP |
security#authorization | 是否启动权限管控 |
将解压后的安装包 bin 路径添加到环境变量 /etc/profile 中,在 PATH 上进行追加
# mongoDB
PATH=$PATH:/usr/local/software/mongoDB/mongodb-linux-x86_64-enterprise-rhel70-4.2.6/bin
复制代码
使用 /var/mongodb/mongod.conf 配置文件启动:
> mongod -f /var/mongodb/mongodb.conf
复制代码
如图所示,则启动成功
启动完成后,验证是否正常运行
> mongo
复制代码
若是正常运行,则进入登陆页面
建立帐号,并设置角色为 root
> use admin
> db.createUser({user:"xxxx",pwd:"xxxxxx",roles:["root"]})
复制代码
设置帐号后,从新登陆,此时须要进行帐号权限校验
> mongo -u accont -p password
复制代码
中止 MongoDB 服务,必须切换到 admin 数据库
> use admin
> db.shutdownServer()
复制代码
在介绍几本操做以前,现将经常使用的 MongoDB 对象与关系型数据库进行类比,便于更好理解 MongoDB 对象。
MongoDB | 关系型数据库 |
---|---|
Database(数据库) | Database(数据库) |
Collection(集合) | Table(表) |
Document(文档) | Row(行) |
Field(字段) | Column(列) |
数据建立和选择,都是使用use db
命令
查看全部数据库
> show dbs
复制代码
删除数据库,先选择再删除
> use db
> db.dropDatabase()
复制代码
建立集合命令,同时,若是没有先建立集合,插入数据时会自动建立集合
> db.createCollection(collectionName, [options])
复制代码
其中options
为可选参数,主要是数据的校验规则,这里不展开分析。
查看数据库中全部集合
> show collections
复制代码
选择集合
> db.getCollection(collectionName)
或
> db.collectionName
复制代码
删除集合
> db.collectionName.drop()
复制代码
MongoDB 插入方法有 insertOne()、insertMany()、insert()、save() 。其中 insert() 功能就包括了 insertOne() 和 insertMany() 功能。
insertOne() 是向数据库中插入一个文档,语法格式为:
db.collect.insertOne(
<document>,
{
writeConcern: <document>
}
)
复制代码
指令 insertOne() 中参数:
向 MongoDB 的 ytao 数据库中,插入一条 article 集合的数据
db.article.insertOne(
{
title: "Dubbo 负载均衡的实现",
url: "https://ytao.top/2020/05/02/23-dubbo-loadbalance/",
author: "ytao"
}
)
复制代码
数据库数据为:
注意: 若是插入数据时,没指定 _id ,则会自动生成 _id ;若是指定 _id ,则必须 _id 在数据库中存在,不然会报错插入失败。
insertMany() 方法是一次插入多个文档,语法格式为:
db.collect.insertMany(
[<document 1>, <document 2>],
{
writeConcern: <document>,
ordered: <boolean>
}
)
复制代码
参数ordered
为是否有序插入文档,可选参数,默认 true。
向 MongoDB 的 ytao 数据库中,插入了两条 article 集合的数据
db.article.insertMany(
[
{
title: "Netty中粘包/拆包处理",
url: "https://ytao.top/2019/12/09/10-netty/",
author: "ytao"
},
{
title: "WebSocket实现Web端即时通讯",
url: "https://ytao.top/2019/11/17/7_websocket/",
author: "ytao"
}
]
)
复制代码
插入后的数据
同理,与 insertOne() 相同,插入重复插入已存在的 _id ,不然报错。
insert() 能够插入单个或多个文档,这个也是最较为经常使用的方法,其语法为
db.collect.insert(
<document> or [<document 1>, <document 2>],
{
writeConcern: <document>,
ordered: <boolean>
}
)
复制代码
插入的文档若是是单个,则相似 insertOne() 的插入方式;若是插入的文档是多个,则相似 insertMany() 的插入方式。其中参数 writeConcern 和 ordered 都是同样。
save() 也能够进行数据插入,当新插入的 _id 存在时,会将已存在的文档进行覆盖,若是 _id 不存在时,则相似 insertOne() 的方式插入。其操做语法:
db.collect.save(
<document>,
{
writeConcern: <document>
}
)
复制代码
进行更新的方法有 ** updateOne()、updateMany()、update()、replaceOne() 以及 save() **。其中 update() 包括 updateOne() 和 updateMany() 的功能。
经过 update() 能够更新一个或多个文档,其语法:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern <document>,
collation: <document>,
arrayFilters: [<filter1>,<filter2>]
}
)
复制代码
update 的参数:
接下来就演示两个例子,一个普通更新,一个带使用 arrayFilters 数据的更新,这个比较难说明,但经过例子就容易理解。
更新前数据:
{
"_id" : ObjectId("5ed299cee89845fb9ec805e4"),
"title" : "WebSocket实现Web端即时通讯",
"url" : "https://ytao.top/2019/11/17/7_websocket/",
"author" : "ytao"
}
复制代码
案例一 将author
数据更新为["杨滔", "ytao"]
db.article.update(
{title: "WebSocket实现Web端即时通讯"},
{$set: {author: ["杨滔", "ytao"]}}
)
复制代码
案例二 将author
数据["杨滔", "ytao"]
的杨滔
更新为YangTao
db.article.update(
{title: "WebSocket实现Web端即时通讯"},
{$set: {"author.$[idx]": "YangTao"}},
{
arrayFilters:[
{"idx": {$eq: "杨滔"}}
]
}
)
复制代码
上面idx
表示数组中元素的位置。
更新后的数据
updateOne() 只能更新一个文档,和 update() 使用相似,将multi
参数值为 false 同样,这里再也不使用案例演示。
语法:
db.collection.updateOne(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string>
}
)
复制代码
hint
是4.2.1
版本中新增的参数,用于指定更新文档的索引。
updateMany() 一样和 update() 更新多个文档使用同样。
语法:
db.collection.updateMany(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string>
}
)
复制代码
replaceOne 将一个文档彻底覆盖,而且不须要指定 _id。只能覆盖一个文档。
语法:
db.collection.replaceOne(
<filter>,
<replacement>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
hint: <document|string>
}
)
复制代码
save() 在更新中是指定 _id 的方式进行文档覆盖。即上文插入中的 save() 用法。
删除文档的方法有 deleteOne()、deleteMany()、remove()
deleteOne() 一次只能删除一个文档,其语法:
db.collection.deleteOne(
<filter>,
{
writeConcern: <document>,
collation: <document>
}
)
复制代码
filter
为删除文档的过滤条件。
deleteMany() 一次可删除多个匹配到的文档,其语法:
db.collection.deleteMany(
<filter>,
{
writeConcern: <document>,
collation: <document>
}
)
复制代码
remove() 是删除查询出的文档,其语法有两个:
db.collection.remove(
<query>,
<justOne>
)
复制代码
或者
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>,
collation: <document>
}
)
复制代码
justOne
参数默认为 false,表示删除所有匹配到的数据;true 表示只删除第一个文档
MongoDB 中经常使用的基本查询有 ** findOne() ** 和 ** find() **。
findOne() 只返回匹配到的第一个文档,语法为:
db.collection.findOne(
<query>,
<projection>
)
复制代码
参数说明:
下面查询一个文档,而且只返回title
和url
经过指定字段的 value 为 1,即表示查询后返回的字段。
find() 是返回全部匹配到的集合,语法为:
db.collection.find(
<query>,
<projection>
)
复制代码
下面案例查询查询结果:
本文对 MongoDB 的入门和基本操做进行了简单的了解,在这使用过程当中,有点相似关系型数据库操做的影子,因此对有关系型数据库使用经验的人,上手是较为简单的。
更多使用操做,官方文档:docs.mongodb.com/manual/refe…
推荐阅读
坚持原创技术文章输出,专一但不限于 Java 相关技术。