MongoDB 部署以及操作
<p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>1、MongoDB简介</li><li>2、MongoDB优势</li><li>3、MongoDB安装</li><li>3、MongoDB用户管理<ul><li>3.1、Mongodb创建超级管理员</li><li>3.2、MongoDB创建读写用户</li><li>3.3、Moongodb指定库授权</li><li>3.4、Mongodb用户登录</li><li>3.5、Mongodb用户删除</li></ul></li><li>4、MongoDB基本操作<ul><li>4.1、Mongodb基础命令</li><li>4.2、Mongodb库操作</li></ul></li><li>5、Mongodb集合及文档操作<ul><li>5.1、创建库和集合</li><li>5.2、创建文档并插入数据</li><li>5.3、查询集合数据</li><li>5.4、多条件查询集合数据</li><li>5.5、查看集合存储信息</li><li>5.6、批量插入数据</li><li>5.7、删除集合</li><li>5.8、重命名集合</li></ul></li></ul></div><p></p><h1 id="1mongodb简介">1、MongoDB简介</h1>
<p><code>MongoDB</code>是一个基于分布式文件存储的数据库。由<code>C++语言编写</code>。旨在为 WEB应用<code>提供可扩展的高性能数据存储</code>解决方案。</p>
<p><code>MongoDB</code>是一个介于<code>关系数据库</code>和<code>非关系数据库</code>之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,</p>
<p><code>MongoDB</code>将数据存储为一个文档,数据结构由键值(key=>value)对组成。<code>MongoDB文档</code>类似于<code>JSON</code>对象。字段值可以包含其他文档,数组及文档数组。<code>JSON</code>语句容易被解释</p>
<p><img src="https://img2020.cnblogs.com/blog/1679739/202005/1679739-20200506171559744-1278376698.png" alt="" loading="lazy"></p>
<h1 id="2mongodb优势">2、MongoDB优势</h1>
<p>具备关系型优势,如:强大查询功能、强一致性、二级索引<br>
具备非关系型优势,如:灵活模式、扩展性、性能</p>
<p><strong>MongoDB特点:</strong></p>
<ol>
<li>自动复制</li>
<li>高可用</li>
<li>自动分片</li>
<li>水平扩展</li>
</ol>
<p><strong>Mongodb逻辑结构</strong></p>
<table>
<thead>
<tr>
<th>Mongodb逻辑结构</th>
<th>MySQL逻辑结构</th>
</tr>
</thead>
<tbody>
<tr>
<td>库(database)</td>
<td>库(database)</td>
</tr>
<tr>
<td>集合(collection)</td>
<td>表(table)</td>
</tr>
<tr>
<td>文档(document)</td>
<td>数据行(ROW)</td>
</tr>
</tbody>
</table>
<h1 id="3mongodb安装">3、MongoDB安装</h1>
<p>Mongodb下载地址</p>
<p>1.系统环境</p>
<pre><code class="language-js"># cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
# uname -r
3.10.0-693.el7.x86_64
</code></pre>
<p>2.系统优化</p>
<ul>
<li>文件描述符</li>
</ul>
<blockquote>
<p>当MongoDB处于频繁访问的状态时,如果shell启动进程所占用的资源设置过低的话,将会产生错误导致无法连接到MongoDB实例。需设置ulimit -n和ulimit -u的值大于65535</p>
</blockquote>
<pre><code class="language-bash"># vim /etc/security/limits.conf
* - nofile 65535
* - nproc 65535
# ulimit -n
65535
# ulimit -n
65535
</code></pre>
<ul>
<li>关闭大页内存</li>
</ul>
<blockquote>
<p>所有的noSQL产品都需要关闭大页内存来提高性能</p>
</blockquote>
<pre><code class="language-bash"># vim /etc/rc.local
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never >/sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never >/sys/kernel/mm/transparent_hugepage/defrag
fi
</code></pre>
<p>其它系统关闭官方文档</p>
<p>3.创建所需用户和组</p>
<pre><code class="language-bash"># groupadd -g 800 mongod
# useradd -u 800 mongod -g mongod
</code></pre>
<p>4.创建mongodb所需目录结构</p>
<pre><code class="language-bash"># mkdir -p /data/mongodb/{bin,conf,log,data}
</code></pre>
<p>5.下载mongodb并解压到指定位置</p>
<pre><code class="language-bash"># cd /opt/src/
# wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.2.16.tgz
# tar xf mongodb-linux-x86_64-rhel70-3.2.16.tgz
// 拷贝目录下bin程序至/data/mongodb/bin
# cp -a mongodb-linux-x86_64-rhel70-3.2.16/bin/* /data/mongodb/bin/
// 设置目录权限
# chown -R mongod:mongod /data/mongodb
// 切换到mongod用户,设置环境变量
# su - mongod
$ echo "export PATH=/data/mongodb/bin:$PATH" >>.bash_profile
$ source.bash_profile
</code></pre>
<p>6.mongod用户下启动mongodb</p>
<pre><code class="language-bash">$ mongod --dbpath=/data/mongodb/data --logpath=/data/mongodb/log/mongodb.log --port=27017 --logappend --fork
// 查看端口
$ netstat -lntup |grep "27017"
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:27017 0.0.0.0:* LISTEN 50179/mongod
启动参数解释:
--dbpath=/data/mongodb/data # 指定mongodb数据目录(第一次启动会先初始化)
--logpath=/data/mongodb/log/mongodb.log# 指定mongodb的日志路径
--port=27017 # 指定mongodb端口号(默认为27017)
--logappend # 追加方式记录日志
--fork # 后台运行
--auth # 是否需要验证权限登录(用户名和密码)
--bind_ip # 限制访问IP
--shutdown # 关闭数据库
</code></pre>
<p>关闭数据库(谨慎执行)</p>
<pre><code class="language-bash">$ mongod --shutdown --dbpath=/data/mongodb/data --logpath=/data/mongodb/log/mongodb.log --port=27017 --logappend --fork
</code></pre>
<p>7.登录mongodb(默认没有用户名和密码)</p>
<pre><code class="language-bash">$ mongo
</code></pre>
<p>8.添加mongodb配置文件</p>
<blockquote>
<p>上面那种手动指定data,log目录路径的方式显得很挫,下面就使用yaml格式编写的配置文件的方式启动mongodb</p>
</blockquote>
<pre><code class="language-yaml">$ vim /data/mongodb/conf/mongodb.conf
storage:
dbPath: "/data/mongodb/data"
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: "/data/mongodb/log/mongodb.log"
processManagement:
fork: true
net:
port: 27017
security:
authorization: enabled
</code></pre>
<p>*<em>基础配置文件参数解释</em></p>
<pre><code class="language-yaml"># 系统日志相关
systemLog:
destination: file
path: "/data/mongodb/log/mongodb.log"#日志路径
logAppend: true #日志以追加模式记录
# 数据存储相关
storage:
dbPath: "/data/mongodb/data" # 数据路径的位置
journal:
enabled: true
# 进程控制相关
processManagement:
fork: true # 后台守护进程
pidFilePath: <string> # pid文件的位置,一般不用配置,可以去掉这行,自动生成到data中
# 网络配置相关
net:
bindIp: <ip> #监听地址,如果不配置这行是监听在0.0.0.0
port: <port> #端口号,默认不配置端口号,则为27017
# 安全验证有关配置
security:
authorization: enabled #是否打开用户密码验证
</code></pre>
<p>9.指定配置文件,启动和关闭mongodb</p>
<pre><code class="language-bash">// 关闭mongodb
$ mongod -f /data/mongodb/conf/mongodb.conf --shutdown
// 启动mongodb
$ mongod -f /data/mongodb/conf/mongodb.conf
</code></pre>
<h1 id="3mongodb用户管理">3、MongoDB用户管理</h1>
<p><code>MonogoDB</code>分为<code>管理员用户</code>和<code>普通用户</code>,并且还有个<code>验证库</code>,建立用户时<code>use到的库</code>(验证库),信息就存储在admin数据库下。在使用用户时,要加上验证库才能登录,对于管理员用户,必须在admin下创建。</p>
<p><strong>基本语法说明:</strong></p>
<pre><code class="language-js">user:用户名
pwd:密码
roles:
role:角色名
db:作用对象
常用role:root、readWrite、read
</code></pre>
<p><strong>用户权限:</strong></p>
<table>
<thead>
<tr>
<th>权限</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>Read</td>
<td>允许用户读取指定数据库</td>
</tr>
<tr>
<td>readWrite</td>
<td>允许用户读写指定数据库</td>
</tr>
<tr>
<td>dbAdmin</td>
<td>允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile</td>
</tr>
<tr>
<td>userAdmin</td>
<td>允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户</td>
</tr>
<tr>
<td>clusterAdmin</td>
<td>只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。</td>
</tr>
<tr>
<td>readAnyDatabase</td>
<td>只在admin数据库中可用,赋予用户所有数据库的读权限</td>
</tr>
<tr>
<td>readWriteAnyDatabase</td>
<td>只在admin数据库中可用,赋予用户所有数据库的读写权限</td>
</tr>
<tr>
<td>userAdminAnyDatabase</td>
<td>只在admin数据库中可用,赋予用户所有数据库的userAdmin权限</td>
</tr>
<tr>
<td>dbAdminAnyDatabase</td>
<td>只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。</td>
</tr>
<tr>
<td>root</td>
<td>只在admin数据库中可用。超级账号,超级权限</td>
</tr>
</tbody>
</table>
<p><strong>注意事项:</strong><br>
要想使用mongodb的用户功能,就需要在配置文件中,加入以下配置</p>
<pre><code class="language-bash">$ vim /data/mongodb/conf/mongodb.conf
....
security:
authorization: enabled
</code></pre>
<p>切换到mongo用户下,重启mongodb</p>
<pre><code class="language-bash"># su - mongod
$ mongod -f /data/mongodb/conf/mongodb.conf--shutdown
$ mongod -f /data/mongodb/conf/mongodb.conf
</code></pre>
<h2 id="31mongodb创建超级管理员">3.1、Mongodb创建超级管理员</h2>
<p>1.创建一个用户:root,权限:超级账号</p>
<pre><code class="language-bash">> use admin
> db.createUser(
{
user: "root",
pwd: "root123",
roles:[ {role: "root",db: "admin"} ]
})
</code></pre>
<blockquote>
<p>创建管理员角色用户的时候,必须到admin下创建,验证用户(返回值为1则用户创建成功)</p>
</blockquote>
<p>2.查看用户是否创建成功</p>
<pre><code class="language-bash">> db.auth('root','root123')
1
</code></pre>
<h2 id="32mongodb创建读写用户">3.2、MongoDB创建读写用户</h2>
<p>1.创建一个用户:dba,权限:读写</p>
<pre><code class="language-bash">> use admin
> db.createUser(
{
user: "dba",
pwd: "dba123",
roles:[ {role: "readWriteAnyDatabase",db: "admin"} ]
})
</code></pre>
<p>查看用户是否创建成功</p>
<pre><code class="language-bash">> db.auth('dba','dba123')
1
</code></pre>
<h2 id="33moongodb指定库授权">3.3、Moongodb指定库授权</h2>
<p>现在有个场景,我们需要对指定的数据库进行用户授权,</p>
<p>创建:app数据库,权限:读写</p>
<p>1.超级管理员用户登录(创建用户肯定要用管理员用户去登录)</p>
<pre><code class="language-bash">$ mongo -uroot -proot123 admin
</code></pre>
<p>2.选择一个验证库/数据库(站在用户认证角度,数据库就是验证库)</p>
<pre><code class="language-bash">> use app
</code></pre>
<p>3.创建用户</p>
<pre><code class="language-bash">> db.createUser(
{
user: "app_admin",
pwd: "app123",
roles:[ {role: "readWrite",db: "app"} ]
})
</code></pre>
<p>4.验证用户是否创建成功</p>
<pre><code class="language-bash">> db.auth('app_admin','app123')
</code></pre>
<p>5.退出mongodb shell,验证登录</p>
<pre><code class="language-bash">> exit
bye
// 输入刚刚创建的用户名/密码,以及验证库
$ mongo -uapp_admin -papp123 app
</code></pre>
<p>6.查看当前登录的用户权限和验证库等相关信息</p>
<pre><code class="language-bash">> db.stats()
{
"db" : "app",
"collections" : 0,
"objects" : 0,
"avgObjSize" : 0,
"dataSize" : 0,
"storageSize" : 0,
"numExtents" : 0,
"indexes" : 0,
"indexSize" : 0,
"fileSize" : 0,
"ok" : 1
}
</code></pre>
<h2 id="34mongodb用户登录">3.4、Mongodb用户登录</h2>
<p>其实上面已经演示了mongodb用户如何登陆,这里在演示如何用<code>超级用户</code>登录,以及本地/远程登录方式。</p>
<p>1.登录验证(需要指定验证库,上面在创建root用户的时候use的库)</p>
<pre><code class="language-bash">// 本地登录
$ mongo -uroot -proot123 admin
// 远程登录
$ mongo -uroot -proot123 10.4.7.51/admin
</code></pre>
<p>2.查询mongodb中的用户信息(必须以root用户登录)</p>
<pre><code class="language-bash">> db.system.users.find().pretty()
</code></pre>
<h2 id="35mongodb用户删除">3.5、Mongodb用户删除</h2>
<p>以root用户登录,use到验证库(admin)</p>
<pre><code class="language-bash">$ mongo -uroot -proot123 admin
> use app
> db.dropUser("app_admin")
</code></pre>
<p>对于<code>Mongodb</code>来说,只要<code>开启鉴权</code>,所有的<code>DB访问操作</code>都需要通过<code>权限检查</code>。而大致的<code>操作流程</code>跟下图类似</p>
<p><img src="https://img2020.cnblogs.com/blog/1679739/202005/1679739-20200506171615855-1433043647.png" alt="" loading="lazy"></p>
<ul>
<li><code>Mongodb 的用户</code>归属于某个数据库,用户需要在所属的数据库中进行鉴权;</li>
<li>一旦通过<code>鉴权</code>,当前的会话(连接)中所有操作将按照用户被赋予的角色权限执行检查。</li>
</ul>
<h1 id="4mongodb基本操作">4、MongoDB基本操作</h1>
<p><strong>Mongodb 默认存在的库:</strong></p>
<ol>
<li>test库:默认存在的库</li>
<li>admin库:系统预留库,mongodb系统管理库</li>
<li>local库:本地预留库,存储关键日志</li>
</ol>
<p><strong>Mongodb 命令种类:</strong></p>
<p>数据库对象:库(database),表(collection),数据行(document)</p>
<p>注意:下面所有基础命令操作都使用超级用户</p>
<h2 id="41mongodb基础命令">4.1、Mongodb基础命令</h2>
<pre><code class="language-bash">//查看命令操作
> db.help
// 查看当前db版本
> db.version()
// 查看数据库
> show databases
> show dbs
// 查看集合/表
> show tables
> show collections
// 创建数据库
> use case
//查看当前库的情况
> db.stats()
// 查看当前通过何种方式连接到数据库
> db.getMongo()
// 退出当前数据库视图
> exit
</code></pre>
<h2 id="42mongodb库操作">4.2、Mongodb库操作</h2>
<p>1、创建数据库<br>
当use的时候,系统就会自动创建一个数据库。<br>
如果use之后没有创建任何集合。<br>
系统就会删除这个数据库。</p>
<p>2、删除数据库<br>
如果没有选择任何数据库,会删除默认的test数据库</p>
<pre><code class="language-bash">> use test
> db.dropDatabase()
{ "ok" : 1 }
</code></pre>
<h1 id="5mongodb集合及文档操作">5、Mongodb集合及文档操作</h1>
<p>当插入一个文档时,一个集合(collections)就会自动创建</p>
<p>文中创建一个user集合,然后在该集合下对其增删改查操作</p>
<h2 id="51创建库和集合">5.1、创建库和集合</h2>
<pre><code class="language-bash">//先进入到库
> use case
// 创建集合
> db.createCollection('user')
{ "ok" : 1 }
// 查看集合
> show collections
user
</code></pre>
<h2 id="52创建文档并插入数据">5.2、创建文档并插入数据</h2>
<p>插入数据的时候会自动生成主键<code>_id</code></p>
<pre><code class="language-bash">> db.user.insert({name:"Jack",age:20,sex:"M",hobby:["basketball","run"]})
WriteResult({ "nInserted" : 1 })
> db.user.insert({name:"Xander",age:25,sex:"M",hobby:["football","run","billiards"]})
WriteResult({ "nInserted" : 1 })
</code></pre>
<h2 id="53查询集合数据">5.3、查询集合数据</h2>
<pre><code>// 查询所有记录(默认每页显示20条记录,用it迭代命令查询下一页)
> db.user.find()
{ "_id" : ObjectId("5eb2787fe4401ef3d2c65107"), "name" : "Jack", "age" : 20, "sex" : "M", "hobby" : [ "basketball", "run" ] }
{ "_id" : ObjectId("5eb2789ce4401ef3d2c65108"), "name" : "Xander", "age" : 25, "sex" : "M", "hobby" : [ "football", "run", "billiards" ] }
// 每页显示1条记录
> DBQuery.shellBatchSize=20
20
// 查询所有记录,并格式化输出
> db.user.find().pretty()
{
"_id" : ObjectId("5eb2787fe4401ef3d2c65107"),
"name" : "Jack",
"age" : 20,
"sex" : "M",
"hobby" : [
"basketball",
"run"
]
}
{
"_id" : ObjectId("5eb2789ce4401ef3d2c65108"),
"name" : "Xander",
"age" : 25,
"sex" : "M",
"hobby" : [
"football",
"run",
"billiards"
]
}
// 查看第1条记录
> db.user.findOne()
{
"_id" : ObjectId("5eb2787fe4401ef3d2c65107"),
"name" : "Jack",
"age" : 20,
"sex" : "M",
"hobby" : [
"basketball",
"run"
]
}
// 查询集合总的记录数
> db.user.count()
2
</code></pre>
<h2 id="54多条件查询集合数据">5.4、多条件查询集合数据</h2>
<p>查询 name = Jack 的记录</p>
<pre><code class="language-bash">> db.user.find({name:"Jack"})
</code></pre>
<p>查询 age > 25 的记录</p>
<pre><code class="language-bash">> db.user.find({age:{$gt:25}})
</code></pre>
<p>查询 age < 25 的记录</p>
<pre><code class="language-bash">> db.user.find({age:{$lt:25}})
</code></pre>
<p>查询 age >= 25 的记录</p>
<pre><code class="language-bash">> db.user.find({age:{$gte:25}})
</code></pre>
<p>查询 age <= 25 的记录:</p>
<pre><code class="language-bash">> db.user.find({age:{$lte:25}})
</code></pre>
<p>查询 age >= 10 并且 age <= 30 的记录</p>
<pre><code class="language-bash">> db.user.find({age:{$gte:10,$lte:30}})
</code></pre>
<p>查询 name 中包含 'X' 的数据(模糊查询)</p>
<pre><code class="language-bash">> db.user.find({name:/X/})
</code></pre>
<p>查询 name 中以 'X' 开头的数据</p>
<pre><code class="language-bash">> db.user.find({name:/^X/})
</code></pre>
<p>查询 name 中以 'r' 结尾的数据</p>
<pre><code class="language-bash">> db.user.find({name:/r$/})
</code></pre>
<p>查询指定列数据</p>
<pre><code class="language-bash">> db.user.find({},{name:"Jack"})// 查询name列数据 第一个字段为查询条件
</code></pre>
<p>查询指定列,name,age数据,且 age> 20</p>
<pre><code class="language-bash">> db.user.find({age:{$gt:20}},{name:true,age:true})
</code></pre>
<p>升序、降序排序</p>
<pre><code class="language-bash">> db.user.find().sort({age:1}) // 升序
> db.user.find().sort({age:-1})// 降序
</code></pre>
<p>查询前2条数据</p>
<pre><code class="language-bash">> db.user.find().limit(2)
</code></pre>
<p>查询后5条数据</p>
<pre><code class="language-bash">>db.user.find().skip(5)
</code></pre>
<p>查询1-10之间的数据</p>
<pre><code class="language-bash">// 可用于分页,limit 是 pageSize,skip 是第几页 * pageSize
> db.user.find().limit(10).skip(1) // 10 之前,1之后,即 1-10 之间
</code></pre>
<p>或者/or 查询,查询 age = 28,或者 age = 29 的数据</p>
<pre><code class="language-bash">> db.user.find({$or:[{age:28},{age:29}]})
</code></pre>
<p>统计 age > 21 的数据的数量</p>
<pre><code class="language-bash">> db.user.find({age:{$gt:21}}).count()
</code></pre>
<h2 id="55查看集合存储信息">5.5、查看集合存储信息</h2>
<pre><code class="language-bash">// 查看集合的存储信息
> db.user.stats()
// 集合中索引+数据压缩存储后的大小
> db.user.totalSize()
65536
// 集合中数据压缩存储的大小
> db.user.storageSize()
32768
</code></pre>
<h2 id="56批量插入数据">5.6、批量插入数据</h2>
<pre><code class="language-bash">> for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new Date()})}
</code></pre>
<h2 id="57删除集合">5.7、删除集合</h2>
<pre><code>// db.collertions.drop,collertions指定集合名
> db.user.drop()
// 删除集合中所有记录
> db.user.remove({})
</code></pre>
<h2 id="58重命名集合">5.8、重命名集合</h2>
<pre><code class="language-bash">> db.user.renameCollection("student")
{ "ok" : 1 }
> db.getCollectionNames()
[ "student" ]
</code></pre><br><br>
来源:https://www.cnblogs.com/jasonminghao/p/12837622.html
頁:
[1]