1、MongoDB简介

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为 WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB是一个介于关系数据库非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,

MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB文档类似于JSON对象。字段值可以包含其他文档,数组及文档数组。JSON语句容易被解释

2、MongoDB优势

具备关系型优势,如:强大查询功能、强一致性、二级索引

具备非关系型优势,如:灵活模式、扩展性、性能

MongoDB特点:

  1. 自动复制
  2. 高可用
  3. 自动分片
  4. 水平扩展

Mongodb逻辑结构

Mongodb逻辑结构 MySQL逻辑结构
库(database) 库(database)
集合(collection) 表(table)
文档(document) 数据行(ROW)

3、MongoDB安装

Mongodb下载地址

1.系统环境

[root@db01 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@db01 ~]# uname -r
3.10.0-693.el7.x86_64

2.系统优化

  • 文件描述符

当MongoDB处于频繁访问的状态时,如果shell启动进程所占用的资源设置过低的话,将会产生错误导致无法连接到MongoDB实例。需设置ulimit -n和ulimit -u的值大于65535

[root@db01 ~]# vim /etc/security/limits.conf
* - nofile 65535
* - nproc 65535 [root@db01 ~]# ulimit -n
65535
[root@db01 ~]# ulimit -n
65535
  • 关闭大页内存

所有的noSQL产品都需要关闭大页内存来提高性能

[root@db01 ~]# 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

其它系统关闭官方文档

3.创建所需用户和组

[root@db01 ~]# groupadd -g 800 mongod
[root@db01 ~]# useradd -u 800 mongod -g mongod

4.创建mongodb所需目录结构

[root@db01 ~]# mkdir -p /data/mongodb/{bin,conf,log,data}

5.下载mongodb并解压到指定位置

[root@db01 ~]# cd /opt/src/
[root@db01 src]# wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.2.16.tgz
[root@db01 src]# tar xf mongodb-linux-x86_64-rhel70-3.2.16.tgz // 拷贝目录下bin程序至/data/mongodb/bin
[root@db01 src]# cp -a mongodb-linux-x86_64-rhel70-3.2.16/bin/* /data/mongodb/bin/ // 设置目录权限
[root@db01 ~]# chown -R mongod:mongod /data/mongodb // 切换到mongod用户,设置环境变量
[root@db01 ~]# su - mongod
[mongod@db01 ~]$ echo "export PATH=/data/mongodb/bin:$PATH" >>.bash_profile
[mongod@db01 ~]$ source .bash_profile

6.mongod用户下启动mongodb

[mongod@db01 ~]$ mongod --dbpath=/data/mongodb/data --logpath=/data/mongodb/log/mongodb.log --port=27017 --logappend --fork

// 查看端口
[mongod@db01 ~]$ 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 # 关闭数据库

关闭数据库(谨慎执行)

[mongod@db01 ~]$ mongod --shutdown --dbpath=/data/mongodb/data --logpath=/data/mongodb/log/mongodb.log --port=27017 --logappend --fork

7.登录mongodb(默认没有用户名和密码)

[mongod@db01 ~]$ mongo

8.添加mongodb配置文件

上面那种手动指定data,log目录路径的方式显得很挫,下面就使用yaml格式编写的配置文件的方式启动mongodb

[mongod@db01 ~]$ 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

*基础配置文件参数解释

# 系统日志相关
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 #是否打开用户密码验证

9.指定配置文件,启动和关闭mongodb

// 关闭mongodb
[mongod@db01 ~]$ mongod -f /data/mongodb/conf/mongodb.conf --shutdown // 启动mongodb
[mongod@db01 ~]$ mongod -f /data/mongodb/conf/mongodb.conf

3、MongoDB用户管理

MonogoDB分为管理员用户普通用户,并且还有个验证库,建立用户时use到的库(验证库),信息就存储在admin数据库下。在使用用户时,要加上验证库才能登录,对于管理员用户,必须在admin下创建。

基本语法说明:

user:用户名
pwd:密码
roles:
role:角色名
db:作用对象 常用role:root、readWrite、read

用户权限:

权限 说明
Read 允许用户读取指定数据库
readWrite 允许用户读写指定数据库
dbAdmin 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root 只在admin数据库中可用。超级账号,超级权限

注意事项:

要想使用mongodb的用户功能,就需要在配置文件中,加入以下配置

[mongod@db01 ~]$ vim /data/mongodb/conf/mongodb.conf
....
security:
authorization: enabled

切换到mongo用户下,重启mongodb

[root@db01 ~]# su - mongod
[mongod@db01 ~]$ mongod -f /data/mongodb/conf/mongodb.conf --shutdown
[mongod@db01 ~]$ mongod -f /data/mongodb/conf/mongodb.conf

3.1、Mongodb创建超级管理员

1.创建一个用户:root,权限:超级账号

> use admin
> db.createUser(
{
user: "root",
pwd: "root123",
roles:[ {role: "root",db: "admin"} ]
})

创建管理员角色用户的时候,必须到admin下创建,验证用户(返回值为1则用户创建成功)

2.查看用户是否创建成功

> db.auth('root','root123')
1

3.2、MongoDB创建读写用户

1.创建一个用户:dba,权限:读写

> use admin
> db.createUser(
{
user: "dba",
pwd: "dba123",
roles:[ {role: "readWriteAnyDatabase",db: "admin"} ]
})

查看用户是否创建成功

> db.auth('dba','dba123')
1

3.3、Moongodb指定库授权

现在有个场景,我们需要对指定的数据库进行用户授权,

创建:app数据库,权限:读写

1.超级管理员用户登录(创建用户肯定要用管理员用户去登录)

[mongod@db01 ~]$ mongo -uroot -proot123 admin

2.选择一个验证库/数据库(站在用户认证角度,数据库就是验证库)

> use app

3.创建用户

> db.createUser(
{
user: "app_admin",
pwd: "app123",
roles:[ {role: "readWrite",db: "app"} ]
})

4.验证用户是否创建成功

> db.auth('app_admin','app123')

5.退出mongodb shell,验证登录

> exit
bye // 输入刚刚创建的用户名/密码,以及验证库
[mongod@db01 ~]$ mongo -uapp_admin -papp123 app

6.查看当前登录的用户权限和验证库等相关信息

> db.stats()
{
"db" : "app",
"collections" : 0,
"objects" : 0,
"avgObjSize" : 0,
"dataSize" : 0,
"storageSize" : 0,
"numExtents" : 0,
"indexes" : 0,
"indexSize" : 0,
"fileSize" : 0,
"ok" : 1
}

3.4、Mongodb用户登录

其实上面已经演示了mongodb用户如何登陆,这里在演示如何用超级用户登录,以及本地/远程登录方式。

1.登录验证(需要指定验证库,上面在创建root用户的时候use的库)

// 本地登录
[mongod@db01 ~]$ mongo -uroot -proot123 admin // 远程登录
[mongod@db01 ~]$ mongo -uroot -proot123 10.4.7.51/admin

2.查询mongodb中的用户信息(必须以root用户登录)

> db.system.users.find().pretty()

3.5、Mongodb用户删除

以root用户登录,use到验证库(admin)

[mongod@db01 ~]$ mongo -uroot -proot123 admin

> use app
> db.dropUser("app_admin")

对于Mongodb来说,只要开启鉴权,所有的DB访问操作都需要通过权限检查。而大致的操作流程跟下图类似

  • Mongodb 的用户归属于某个数据库,用户需要在所属的数据库中进行鉴权;
  • 一旦通过鉴权,当前的会话(连接)中所有操作将按照用户被赋予的角色权限执行检查。

4、MongoDB基本操作

Mongodb 默认存在的库:

  1. test库:默认存在的库
  2. admin库:系统预留库,mongodb系统管理库
  3. local库:本地预留库,存储关键日志

Mongodb 命令种类:

数据库对象:库(database),表(collection),数据行(document)

注意:下面所有基础命令操作都使用超级用户

4.1、Mongodb基础命令

//查看命令操作
> db.help // 查看当前db版本
> db.version() // 查看数据库
> show databases
> show dbs // 查看集合/表
> show tables
> show collections // 创建数据库
> use case //查看当前库的情况
> db.stats() // 查看当前通过何种方式连接到数据库
> db.getMongo() // 退出当前数据库视图
> exit

4.2、Mongodb库操作

1、创建数据库

当use的时候,系统就会自动创建一个数据库。

如果use之后没有创建任何集合。

系统就会删除这个数据库。

2、删除数据库

如果没有选择任何数据库,会删除默认的test数据库

> use test
> db.dropDatabase()
{ "ok" : 1 }

5、Mongodb集合及文档操作

当插入一个文档时,一个集合(collections)就会自动创建

文中创建一个user集合,然后在该集合下对其增删改查操作

5.1、创建库和集合

//先进入到库
> use case // 创建集合
> db.createCollection('user')
{ "ok" : 1 } // 查看集合
> show collections
user

5.2、创建文档并插入数据

插入数据的时候会自动生成主键_id

> 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 })

5.3、查询集合数据

// 查询所有记录(默认每页显示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

5.4、多条件查询集合数据

查询 name = Jack 的记录

> db.user.find({name:"Jack"})

查询 age > 25 的记录

> db.user.find({age:{$gt:25}})

查询 age < 25 的记录

> db.user.find({age:{$lt:25}})

查询 age >= 25 的记录

> db.user.find({age:{$gte:25}})

查询 age <= 25 的记录:

> db.user.find({age:{$lte:25}})

查询 age >= 10 并且 age <= 30 的记录

> db.user.find({age:{$gte:10,$lte:30}})

查询 name 中包含 'X' 的数据(模糊查询)

> db.user.find({name:/X/})

查询 name 中以 'X' 开头的数据

> db.user.find({name:/^X/})

查询 name 中以 'r' 结尾的数据

> db.user.find({name:/r$/})

查询指定列数据

> db.user.find({},{name:"Jack"})  // 查询name列数据 第一个字段为查询条件

查询指定列,name,age数据,且 age > 20

> db.user.find({age:{$gt:20}},{name:true,age:true})

升序、降序排序

> db.user.find().sort({age:1})   // 升序
> db.user.find().sort({age:-1}) // 降序

查询前2条数据

> db.user.find().limit(2)

查询后5条数据

>db.user.find().skip(5)

查询1-10之间的数据

// 可用于分页,limit 是 pageSize,skip 是第几页 * pageSize
> db.user.find().limit(10).skip(1) // 10 之前,1之后,即 1-10 之间

或者/or 查询,查询 age = 28,或者 age = 29 的数据

> db.user.find({$or:[{age:28},{age:29}]})

统计 age > 21 的数据的数量

> db.user.find({age:{$gt:21}}).count()

5.5、查看集合存储信息

// 查看集合的存储信息
> db.user.stats() // 集合中索引+数据压缩存储后的大小
> db.user.totalSize()
65536 // 集合中数据压缩存储的大小
> db.user.storageSize()
32768

5.6、批量插入数据

> for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new Date()})}

5.7、删除集合

// db.collertions.drop,collertions指定集合名
> db.user.drop() // 删除集合中所有记录
> db.user.remove({})

5.8、重命名集合

> db.user.renameCollection("student")
{ "ok" : 1 }
> db.getCollectionNames()
[ "student" ]

MongoDB 部署以及操作的更多相关文章

  1. 分布式监控系统Zabbix3.4-针对MongoDB性能监控操作笔记

    公司在IDC机房的一台服务器上部署了MongoDB,由于所存储的业务数据比较重要,所以对MongoDB的监控显得尤为重要!Zabbix监控MongoDB性能的原理:通过echo "db.se ...

  2. MongoDB Java API操作很全的整理

    MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写,一般生产上建议以共享分片的形式来部署. 但是MongoDB官方也提供了其它语言的客户端操作API.如下图所示: 提供了C.C++ ...

  3. MongoDB 部署 & 基础命令

    MongoDB 官方文档 MongoDB 介绍 Mongodb 由 C++ 语言编写的,是一个基于分布式文件存储的开源数据库系统. 是专为可扩展性,高性能和高可用性而设计的数据库, 是非关系型数据库中 ...

  4. 【翻译】MongoDB指南/CRUD操作(二)

    [原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(二) 主要内容: 更新文档,删除文档,批量写操作,SQL与MongoDB映射图,读隔离(读关 ...

  5. 【翻译】MongoDB指南/CRUD操作(一)

    [原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(一) 主要内容:CRUD操作简介,插入文档,查询文档. CRUD操作包括创建.读取.更新和删 ...

  6. MongoDB的CRUD操作

    1. 前言 在上一篇文章中,我们介绍了MongoDB.现在,我们来看下如何在MongoDB中进行常规的CRUD操作.毕竟,作为一个存储系统,它的基本功能就是对数据进行增删改查操作. MongoDB中的 ...

  7. MongoDB各种查询操作详解

    这篇文章主要介绍了MongoDB各种查询操作详解,包括比较查询.关联查询.数组查询等,需要的朋友可以参考下   一.find操作 MongoDB中使用find来进行查询,通过指定find的第一个参数可 ...

  8. mongodb的常用操作

    对于nosql之前工作中有用到bekerlydb,最近开始了解mongodb,先简单写下mongodb的一些常用操作,当是个总结: 1.mongodb使用数据库(database)和集合(collec ...

  9. MongoDB基本命令行操作

    1. 连接MongoDB: Mongodb://username:password@hostname/dbname 2. 创建数据库: use dbname:如果数据库不存在则创建数据库,否则切换到指 ...

随机推荐

  1. 通过STC15F2K60S2控制SIM900A发中英文短信,打电话

    本文通过串口通信,使用STC15系列单片机实现发短信打电话功能. 一. 注意事项 1. 首先要确定手机卡已经注册到网络,具备打电话发短信功能 2. 正确的硬件连接: P3.0-----STXD或者5V ...

  2. Ajax 简述与基础语法

    目录 Ajax 1. 原生 JS 实现 Ajax 2. 使用 Ajax 实现异步通信 a. Ajax 的基础语法 b. 用 Ajax 传递数据 i. 传递字符串数据 ii. 传递 JSON 数据 3. ...

  3. 3d模型一般怎么导入到到Threejs中使用

    这是我之前做的一个demo,导入的3d模型文件是obj格式的,需要使用OBJLoader和MTLLoader, mtl文件用于描述多边形可视面貌的材质如果你可以导出obj.mtl文件的话,那么就可以使 ...

  4. Linux-设备

    一.在Linux系统中,每个设备都被当成一个文件来对待. 在Linux系统中,几乎所有的硬件设备都在/dev这个目录内.

  5. Alpha Release Note 12/15/2015

    内容提要: ******Personal Photo Experience可供您存放所有的私人照片,系统会自动整理内容,您可以借助搜索功能快速找到所需图片,同时过滤重复图片和低质量图片,给您全新的搜索 ...

  6. 学习JVM参数前必须了解的

    JVM参数是什么 大家照相通常使用手机就够用了,但是针对发烧友来说会使用更专业的设备,比如单反相机,在单反里有好几个模式,P/A/S/M,其中P是傻瓜模式,程序会自动根据环境设置快门速度和光圈大小,以 ...

  7. Python - 和我聊Python节目最新一期介绍 - 257期:使用超级电脑,Python,射电天文学知识来探索银河系

    今天,给大家简单介绍和我聊Python的最新一期节目,第257期:使用超级电脑,Python,射电天文学知识来探索银河系. 听着标题就觉得高大上,是的,我也是这么认为的.这次请的嘉宾来头很大,来自国际 ...

  8. java 一维数组的总结笔记

    数组 1. 一位数组的声明方式 type[] array Name 或 type arrayName[];(推荐使用第二种) 错误的声明方式 //int[5] intErrorArray;错误的 // ...

  9. mybatis源码学习:从SqlSessionFactory到代理对象的生成

    目录 一.根据XML配置文件构建SqlSessionFactory 二.通过SqlSessionFactory创建SqlSession 三.getMapper获取动态代理对象 一.根据XML配置文件构 ...

  10. react: typescript jest && enzyme

    Install Jest 1.install jest dependencies jest @types/jest ts-jest -D 2.jest.config.js module.exports ...