前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >MongoDB 入门篇

MongoDB 入门篇

作者头像
惨绿少年
发布于 2019-05-24 12:35:42
发布于 2019-05-24 12:35:42
1.4K00
代码可运行
举报
文章被收录于专栏:惨绿少年惨绿少年
运行总次数:0
代码可运行

1.1 数据库管理系统

    在了解MongoDB之前需要先了解先数据库管理系统

1.1.1 什么是数据?

  数据(英语:data),是指未经过处理的原始记录。

  一般而言,数据缺乏组织及分类,无法明确的表达事物代表的意义,它可能是一堆的杂志、一大叠的报纸、数种的开会记录或是整本病人的病历纪录。数据描述事物的符号记录,是可定义为意义的实体,涉及事物的存在形式。是关于事件之一组离散且客观的事实描述,是构成讯息和知识的原始材料。

1.1.2 什么是数据库管理系统?

  数据库管理系统(英语:database management system,缩写:DBMS) 是一种针对对象数据库,为管理数据库而设计的大型电脑软件管理系统。

  具有代表性的数据管理系统有:Oracle、Microsoft SQL Server、Access、MySQLPostgreSQL等。通常数据库管理师会使用数据库管理系统来创建数据库系统。

  现代DBMS使用不同的数据库模型追踪实体、属性和关系。在个人电脑、大型计算机和主机上应用最广泛的数据库管理系统是关系型DBMS(relational DBMS)。在关系型数据模型中,用二维表格表示数据库中的数据。这些表格称为关系。

  数据库管理系统主要分为俩大类:RDBMS、NOSQL

  关于RDBMS的更多信息参考:http://www.cnblogs.com/clsn/category/1131345.html

1.1.3 常见数据库管理系统?

常见的数据库管理系统,及其排名情况如下:

图 - 数据库管理系统使用情况世界排名

数据来源:https://db-engines.com/en/ranking

1.2 NoSQL是什么?

1.2.1 NoSQL简介

  NoSQL是对不同于传统的关系数据库的数据库管理系统的统称。

  两者存在许多显著的不同点,其中最重要的是NoSQL不使用SQL作为查询语言。其数据存储可以不需要固定的表格模式,也经常会避免使用SQL的JOIN操作,一般有水平可扩展性的特征。

  NoSQL一词最早出现于1998年,是Carlo Strozzi开发的一个轻量、开源、不提供SQL功能的关系数据库。

2009年,Last.fm的Johan Oskarsson发起了一次关于分布式开源数据库的讨论,来自Rackspace的Eric Evans再次提出了NoSQL的概念,这时的NoSQL主要指非关系型、分布式、不提供ACID的数据库设计模式。

  2009年在亚特兰大举行的"no:sql(east)"讨论会是一个里程碑,其口号是"select fun, profit from real_world where relational=false;"。因此,对NoSQL最普遍的解释是“非关联型的”,强调Key-Value Stores和文档数据库的优点,而不是单纯的反对RDBMS

  基于2014年的收入,NoSQL市场领先企业是MarkLogic,MongoDB和Datastax。基于2015年的人气排名,最受欢迎的NoSQL数据库是MongoDB,Apache Cassandra和Redis.

1.2.2 NoSQL数据库四大家族

NoSQL中的四大家族主要是:列存储、键值、图像存储、文档存储,其类型产品主要有以下这些。

存储类型

NoSQL

键值存储

最终一致性键值存储

Cassandra、Dynamo、Riak、Hibari、Virtuoso、Voldemort

内存键值存储

Memcached、Redis、Oracle Coherence、NCache、 Hazelcast、Tuple space、Velocity

持久化键值存储

BigTable、LevelDB、Tokyo Cabinet、Tarantool、TreapDB、Tuple space

文档存储

MongoDB、CouchDB、SimpleDB、 Terrastore 、 BaseX 、Clusterpoint 、 Riak、No2DB

图存储

FlockDB、DEX、Neo4J、AllegroGraph、InfiniteGraph、OrientDB、Pregel

列存储

Hbase、Cassandra、Hypertable

1.2.3 NoSQL的优势

  高可扩展性、分布式计算、没有复杂的关系、低成本

  架构灵活、半结构化数据

1.2.4 NoSQL与RDBMS对比

NoSQL

RDBMS

代表着不仅仅是SQL 没有声明性查询语言 没有预定义的模式 键 - 值对存储,列存储,文档存储,图形数据库 最终一致性,而非ACID属性 非结构化和不可预知的数据 CAP定理 高性能,高可用性和可伸缩性

高度组织化结构化数据 结构化查询语言(SQL) (SQL) 数据和关系都存储在单独的表中。 数据操纵语言,数据定义语言 严格的一致性 基础事务

1.3 MongoDB简介

1.3.1 MongoDB是什么

    MongoDB并非芒果的意思,而是源于 Humongous(巨大)一词。

1.3.2 MongoDB的特性

  MongoDB的3大技术特色如下所示:

除了上图所示的还支持

  二级索引、动态查询、全文搜索 、聚合框架、MapReduce、GridFS、地理位置索引、内存引擎 、地理分布等一系列的强大功能。

但是其也有些许的缺点,例如:

  多表关联: 仅仅支持Left Outer Join   SQL 语句支持: 查询为主,部分支持   多表原子事务: 不支持   多文档原子事务:不支持   16MB 文档大小限制,不支持中文排序 ,服务端 Javascript 性能欠佳

1.3.3 关系型数据库与mongodb对比

存储方式对比

在传统的关系型数据库中,存储方式是以表的形式存放,而在MongoDB中,以文档的形式存在。

数据库中的对应关系,及存储形式的说明

MongoDB与SQL的结构对比详解

SQL Terms/Concepts

MongoDB Terms/Concepts

database

database

table

collection

row

document or BSON document

column

field

index

index

table joins

embedded documents and linking

primary key Specify any unique column or column combination as primary key.

primary key In MongoDB, the primary key is automatically set to the _id field.

aggregation (e.g. group by)

aggregation pipeline See the SQL to Aggregation Mapping Chart.

1.3.4 MongoDB数据存储格式

JSON格式

  JSON 数据格式与语言无关,脱胎于 JavaScript,但目前很多编程语言都支持 JSON 格式数据的生成和解析。JSON 的官方 MIME 类型是 application/json,文件扩展名是 .json。

  MongoDB 使用JSON(JavaScript ObjectNotation)文档存储记录。

  JSON数据库语句可以容易被解析。

  Web 应用大量使用,NAME-VALUE 配对

BSON格式

  BSON是由10gen开发的一个数据格式,目前主要用于MongoDB中,是MongoDB的数据存储格式。BSON基于JSON格式,选择JSON进行改造的原因主要是JSON的通用性及JSON的schemaless的特性。

  二进制的JSON,JSON文档的二进制编码存储格式

  BSON有JSON没有的Date和BinData

  MongoDB中document以BSON形式存放

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.meeting.insert({meeting:M1 June",Date:"2018-01-06"});

1.3.5 MongoDB的优势

   ? MongoDB是开源产品

   ? On GitHub Url:https://github.com/mongodb

   ? Licensed under the AGPL,有开源的社区版本

   ? 起源& 赞助by MongoDB公司,提供商业版licenses 许可

  这些优势造就了mongodb的丰富的功能:

  JSON 文档模型、动态的数据模式、二级索引强大、查询功能、自动分片、水平扩展、自动复制、高可用、文本搜索、企业级安全、聚合框架MapReduce、大文件存储GridFS

1.3.6 高可用的复制集群

  自动复制和故障切换

  多数据中心支持滚动维护无需关机支持最多50个成员

1.3.7 水平扩展

  这种方式是目前构架上的主流形式,指的是通过增加服务器数量来对系统扩容。在这样的构架下,单台服务器的配置并不会很高,可能是配置比较低、很廉价的 PC,每台机器承载着系统的一个子集,所有机器服务器组成的集群会比单体服务器提供更强大、高效的系统容载量。

  这样的问题是系统构架会比单体服务器复杂,搭建、维护都要求更高的技术背景。分片集群架构如下图所示:

1.3.8 各存储引擎的对比

MySQL InnoDB

MySQL NDB

Oracle

MongoDB MAPI

MongoDB WiredTiger

事务

YES

YES

ES

NO

NO

锁粒度

ROW-level

ROW-level

ROW-level

Collection-level

Document-level

Geospatial

YES

YES

YES

YES

YES

MVCC

YES

NO

YES

NO

NO

Replication

YES

YES

YES

YES

YES

外键

YES

YES(From 7.3)

YES

NO

NO

数据库集群

NO

YES

YES

YES

YES

B-TREE索引

YES

YES

YES

YES

YES

全文检索

YES

NO

YES

YES

YES

数据压缩

YES

NO

YES

NO

YES

存储限制

64TB

384EB

NO

NO

NO

表分区

YES

YES

YES

YES (分片)

YES (分片)

1.3.9 数据库功能和性能对比

  由下图可以看出MongoDB数据库的性能扩展能力及功能都较好,都能够在数据库中,站立一足之地。

1.3.10 MongoDB适用场景

  网站数据、缓存等大尺寸、低价值的数据

  在高伸缩性的场景,用于对象及JSON数据的存储。

1.3.11 MongoDB 慎用场景

慎用场景

原因

PB 数据持久存储大数据分析数据湖

Hadoop、Spark提供更多分析运算功能和工具,并行计算能力更强 MongoDB + Hadoop/Spark

搜索场景:文档有几十个字段,需要按照任意字段搜索并排序限制等

不建索引查询太慢,索引太多影响写入及更新操作

ERP、CRM或者类似复杂应用,几十上百个对象互相关联

关联支持较弱,事务较弱

需要参与远程事务,或者需要跨表,跨文档原子性更新的

MongoDB 事务支持仅限于本机的单文档事务

100% 写可用:任何时间写入不能停

MongoDB换主节点时候会有短暂的不可写设计所限

1.3.12 什么时候该MongDB

应用特征

Yes/No?

我的数据量是有亿万级或者需要不断扩容

需要2000-3000以上的读写每秒

新应用,需求会变,数据模型无法确定

我需要整合多个外部数据源

我的系统需要99.999%高可用

我的系统需要大量的地理位置查询

我的系统需要提供最小的latency

我要管理的主要数据对象<10

  在上面的表格中进行选择,但有1个yes的时候:可以考虑MongoDB;当有2个以上yes的时候:不会后悔的选择!

1.4 MongoDB的部署

  MongoDB官网:https://www.mongodb.com/

  CentOS6.X版本软件下载地址:https://www.mongodb.org/dl/linux/x86_64-rhel62

    其他版本请到进行官网下载。

1.4.1 安装前准备

  在安装之前首先确认该版本软件是否支持你的操作系统。

    更多详情查看:https://docs.mongodb.com/manual/installation/

Platform

3.6 Community & Enterprise

3.4 Community & Enterprise

3.2 Community & Enterprise

3.0 Community & Enterprise

RHEL/CentOS 6.2 and later

RHEL/CentOS 7.0 and later

1.4.2 环境说明

系统环境说明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@MongoDB ~]# cat /etc/redhat-release 
CentOS release 6.9 (Final)
[root@MongoDB ~]# uname -r
2.6.32-696.el6.x86_64
[root@MongoDB ~]# /etc/init.d/iptables status
iptables: Firewall is not running.
[root@MongoDB ~]# getenforce 
Disabled
[root@MongoDB ~]# hostname -I
10.0.0.152 172.16.1.152

软件版本说明

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
本次使用的mongodb版本为:mongodb-linux-x86_64-3.2.8.tgz

1.4.3 部署MongoDB

在root用户下操作

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat >> /etc/rc.local <<'EOF'
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
EOF

  该方法仅限与CentOS系统使用,其他系统关闭参照官方文档:       https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/

  Transparent Huge Pages (THP),通过使用更大的内存页面,可以减少具有大量内存的机器上的缓冲区(TLB)查找的开销。

  但是,数据库工作负载通常对THP表现不佳,因为它们往往具有稀疏而不是连续的内存访问模式。您应该在Linux机器上禁用THP,以确保MongoDB的最佳性能。

创建用户

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
groupadd -g 800 mongod
useradd  -u 801 -g mongod  mongod

  修改用户密码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo 123456 |passwd --stdin  mongod

创建程序目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mkdir -p /application/mongodb/   &&\
cd  /application/mongodb/   &&\
mkdir  -p  bin  conf  log  data

下载程序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd  /application/mongodb/
wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.8.tgz

解压程序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tar xf  mongodb-linux-x86_64-3.2.8.tgz
cd mongodb-linux-x86_64-3.2.8/bin/ &&\
cp * /mongodb/bin

修改程序属主

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
chown -R mongod:mongod /application/mongodb

  切换到mongod用户,设置用户环境变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
su - mongod
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat >> .bash_profile <<'EOF'
export PATH=/mongodb/bin:$PATH
EOF
source .bashprofile

至此,MongoDB数据库部署完成

1.4.4 管理MongoDB

  数据库的启动与关闭

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
启动:mongod --dbpath=/application/mongodb/data --logpath=/application/mongodb/log/mongodb.log --port=27017 --logappend --fork
关闭:mongod --shutdown  --dbpath=/application/mongodb/data --logpath=/application/mongodb/log/mongodb.log --port=27017 --logappend --fork

参数说明:

参数

参数说明

--dbpath

数据存放路径

--logpath

日志文件路径

--logappend

日志输出方式

--port

启用端口号

--fork

在后台运行

--auth

是否需要验证权限登录(用户名和密码)

--bind_ip

限制访问的ip

--shutdown

关闭数据库

登入数据库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[mongod@MongoDB ~]$ mongo
MongoDB shell version: 3.2.8
connecting to: test
>

使用配置文件的方式管理数据库:

普通格式配置文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd /application/mongodb/conf/
[mongod@MongoDB conf]$ vim mongod1.conf 
dbpath=/application/mongodb/data
logpath=/application/mongodb/log/mongodb.log
port=27017
logappend=1
fork=1

使用配置文件时的启动与关闭:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
启动:mongod -f mongod1.conf 
关闭:mongod -f mongod1.conf  --shutdown

YAML格式配置文件(3.X 版本官方推荐使用)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[mongod@MongoDB conf]$ cat  mongod.conf 
systemLog:
   destination: file
   path: "/application/mongodb/log/mongod.log"
   logAppend: true
storage:
   journal:
      enabled: true
   dbPath: "/application/mongodb/data"
processManagement:
   fork: true
net:
   port: 27017

在数据库中关闭数据库的方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
shell > mongo
[mongod@MongoDB conf]$ mongo
MongoDB shell version: 3.2.8
connecting to: test
> db.shutdownServer()
shutdown command only works with the admin database; try 'use admin'
> use admin
> db.shutdownServer()
server should be down...

注:

mongod进程收到SIGINT信号或者SIGTERM信号,会做一些处理 > 关闭所有打开的连接 > 将内存数据强制刷新到磁盘 > 当前的操作执行完毕 > 安全停止 切忌kill -9   数据库直接关闭,数据丢失,数据文件损失,修复数据库(成本高,有风险)

使用kill命令关闭进程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kill -2 PID
  原理:-2表示向mongod进程发送SIGINT信号。
或
$ kill -4 PID
  原理:-4表示向mognod进程发送SIGTERM信号。

使用脚本管理mongodb服务

注:该脚本可以直接在root用户下运行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1 [root@MongoDB ~]# cat  /etc/init.d/mongod  
 2 #!/bin/bash
 3 #
 4 # chkconfig: 2345 80 90
 5 # description:mongodb
 6 # by clsn
 7 # blog_url http://blog.nmtui.com
 8 #################################
 9 
10 MONGODIR=/application/mongodb
11 MONGOD=$MONGODIR/bin/mongod
12 MONGOCONF=$MONGODIR/conf/mongod.conf
13 InfoFile=/tmp/start.mongo
14 
15 . /etc/init.d/functions 
16 
17 status(){
18   PID=`awk 'NR==2{print $NF}' $InfoFile`
19   Run_Num=`ps -p $PID|wc -l`
20   if [ $Run_Num -eq 2 ]; then
21     echo "MongoDB is running"
22   else 
23     echo "MongoDB is shutdown"
24     return 3
25   fi
26 }
27 
28 start() {
29   status &>/dev/null
30   if [ $? -ne 3 ];then 
31     action "启动MongoDB,服务运行中..."  /bin/false 
32     exit 2
33   fi
34   sudo su - mongod -c "$MONGOD -f $MONGOCONF" >$InfoFile 2>/dev/null 
35   if [ $? -eq 0 ];then 
36     action "启动MongoDB"  /bin/true
37   else
38     action "启动MongoDB"  /bin/false
39   fi
40 }
41 
42 
43 stop() {
44   sudo su - mongod -c "$MONGOD -f $MONGOCONF --shutdown"  &>/dev/null
45   if [ $? -eq 0 ];then
46     action "停止MongoDB"  /bin/true
47   else 
48     action "停止MongoDB"  /bin/false
49   fi 
50 }
51 
52 
53 case "$1" in
54   start)
55     start
56     ;;
57   stop)
58     stop
59     ;;
60   restart)
61     stop
62     sleep 2
63     start
64     ;;
65   status)
66     status
67     ;;
68   *)
69     echo $"Usage: $0 {start|stop|restart|status}"
70     exit 1
71 esac

1.5 MongoDB的基本操作

Mongodb中关键字种类:

db(数据库实例级别) db本身 db.connection 数据库下的集合信息 db.collection.xxx( rs(复制集级别) sh(分片级别)

1.5.1 查询操作

在客户端指定数据库进行连接:(默认连接本机test数据库)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[mongod@MongoDB ~]$ mongo 10.0.0.152/admin
MongoDB shell version: 3.2.8
connecting to: 10.0.0.152/admin
> db
admin

查看当前数据库版本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.version()
3.2.8

切换数据库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> use test;
switched to db test

显示当前数据库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db
test
> db.getName()
test

查询所有数据库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> show dbs;
clsn   0.000GB
local  0.000GB
test   0.000GB
> show databases;
clsn   0.000GB
local  0.000GB
test   0.000GB

查看clsn数据库当前状态

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> use clsn;
> db.stats()
{
    "db" : "clsn",
    "collections" : 1,
    "objects" : 10000,
    "avgObjSize" : 80,
    "dataSize" : 800000,
    "storageSize" : 258048,
    "numExtents" : 0,
    "indexes" : 1,
    "indexSize" : 94208,
    "ok" : 1
}

查看当前数据库的连接机器地址

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.getMongo()
connection to 127.0.0.1

1.5.2 数据管理

创建数据库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> use clsn;

说明:

创建数据库: 当use的时候,系统就会自动创建一个数据库。 如果use之后没有创建任何集合。系统就会删除这个数据库。

删除数据库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> show dbs;
clsn   0.000GB
local  0.000GB
test   0.000GB
> use clsn 
switched to db clsn
> db.dropDatabase()
{ "dropped" : "clsn", "ok" : 1 }

说明:

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

创建集合

方法一:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> use clsn;
switched to db clsn
> db.createCollection('a')
{ "ok" : 1 }
> db.createCollection('b')
{ "ok" : 1 }

查看当前数据下的所有集合

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> show collections;
a
b
> db.getCollectionNames()
[ "a", "b" ]

方法二:

  当插入一个文档的时候,一个集合就会自动创建。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> use clsn;
switched to db clsn
> db.c.insert({name:'clsn'});
WriteResult({ "nInserted" : 1 })
> db.c.insert({url:'http://blog.nmtui.com'});
WriteResult({ "nInserted" : 1 })

查看创建的合集

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.getCollectionNames()
[ "a", "b", "c" ]

查看合集里的内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.c.find()
{ "_id" : ObjectId("5a4cbcea83ec78b7bea904f8"), "name" : "clsn" }
{ "_id" : ObjectId("5a4cbcfc83ec78b7bea904f9"), "url" : "http://blog.nmtui.com" }

重命名集合

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.c.renameCollection("clsn")
{ "ok" : 1 }
> db.getCollectionNames()
[ "a", "b", "clsn" ]

删除合集

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.a.drop()
true
> db.getCollectionNames()
[ "b", "clsn" ]

插入1w行数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> for(i=0;i<10000;i++){ db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new Date()}); }
WriteResult({ "nInserted" : 1 })

查询集合中的查询所有记录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.log.find()

注:默认每页显示20条记录,当显示不下的的情况下,可以用it迭代命令查询下一页数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> DBQuery.shellBatchSize=50;    # 每页显示50条记录
50 
app> db.log.findOne()            # 查看第1条记录
app> db.log.count()              # 查询总的记录数
app> db.log.find({uid:1000});    # 查询UUID1000的数据

删除集合中的记录数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>  db.log.distinct("name")      #  查询去掉当前集合中某列的重复数据
[ "mongodb" ]
> db.log.remove({})             #  删除集合中所有记录
WriteResult({ "nRemoved" : 10000 })  
> db.log.distinct("name")
[ ]

查看集合存储信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.log.stats()          # 查看数据状态
> db.log.dataSize()       # 集合中数据的原始大小
> db.log.totalIndexSize() # 集合中索引数据的原始大小
> db.log.totalSize()      # 集合中索引+数据压缩存储之后的大小
> db.log.storageSize()    # 集合中数据压缩存储的大小

pretty()使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.log.find({uid:1000}).pretty()
{
    "_id" : ObjectId("5a4c5c0bdf067ab57602f7c2"),
    "uid" : 1000,
    "name" : "mongodb",
    "age" : 6,
    "date" : ISODate("2018-01-03T04:28:59.343Z")
}

1.6 MongoDB中用户管理

  MongoDB数据库默认是没有用户名及密码的,即无权限访问限制。为了方便数据库的管理和安全,需创建数据库用户。

1.6.1 用户的权限

  用户中权限的说明

权限

说明

Read

允许用户读取指定数据库

readWrite

允许用户读写指定数据库

dbAdmin

允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile

userAdmin

允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户

clusterAdmin

只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。

readAnyDatabase

只在admin数据库中可用,赋予用户所有数据库的读权限

readWriteAnyDatabase

只在admin数据库中可用,赋予用户所有数据库的读写权限

userAdminAnyDatabase

只在admin数据库中可用,赋予用户所有数据库的userAdmin权限

dbAdminAnyDatabase

只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。

root

只在admin数据库中可用。超级账号,超级权限

   更多关于用户权限的说明参照:https://docs.mongodb.com/manual/core/security-built-in-roles/

用户创建语法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
user: "<name>", 
pwd: "<cleartext password>", 
customData: { <any information> }, 
roles: [ 
{ role: "<role>", 
db: "<database>" } | "<role>", 
... 
] 
}

语法说明:

user字段:用户的名字; pwd字段:用户的密码; cusomData字段:为任意内容,例如可以为用户全名介绍; roles字段:指定用户的角色,可以用一个空数组给新用户设定空角色; roles 字段:可以指定内置角色和用户定义的角色。

1.6.2 创建管理员用户

进入管理数据库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> use admin

创建管理用户,root权限

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.createUser(
  {
    user: "root",
    pwd: "root",
    roles: [ { role: "root", db: "admin" } ]
  }
)    

注意:

  创建管理员角色用户的时候,必须到admin下创建。    删除的时候也要到相应的库下操作。

查看创建完用户后的collections;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 > show tables; 
system.users  # 用户存放位置
system.version

查看创建的管理员用户

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    > show users
    {
        "_id" : "admin.root",
        "user" : "root",
        "db" : "admin",
        "roles" : [
            {
                "role" : "root",
                "db" : "admin"
            }
        ]
    }

验证用户是否能用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> db.auth("root","root")
1  # 返回 1 即为成功

用户创建完成后在配置文件中开启用户验证

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat >>/application/mongodb/conf/mongod.conf<<-'EOF'
security:
  authorization: enabled
EOF

重启服务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/etc/init.d/mongod  restart

登陆测试,注意登陆时选择admin数据库

 注意:用户在哪个数据库下创建的,最后加上什么库。

方法一:命令行中进行登陆

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[mongod@MongoDB ~]$ mongo -uroot -proot admin 
MongoDB shell version: 3.2.8
connecting to: admin
> 

方法二:在数据库中进行登陆验证:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[mongod@MongoDB ~]$ mongo 
MongoDB shell version: 3.2.8
connecting to: test
> use admin
switched to db admin
> db.auth("root","root")
1
> show tables;
system.users
system.version

1.6.3 按生产需求创建应用用户

创建对某库的只读用户

在test库创建只读用户test

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use test
db.createUser(
  {
    user: "test",
    pwd: "test",
    roles: [ { role: "read", db: "test" } ]
  }
)

测试用户是否创建成功

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.auth("test","test")
show  users;

登录test用户,并测试是否只读

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show collections;
db.createCollection('b')

创建某库的读写用户

  创建test1用户,权限为读写

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.createUser(
  {
    user: "test1",
    pwd: "test1",
    roles: [ { role: "readWrite", db: "test" } ]
  }
)

查看并测试用户

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show users;
db.auth("test1","test1")

创建对多库不同权限的用户

创建对app为读写权限,对test库为只读权限的用户

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use app
db.createUser(
  {
    user: "app",
    pwd: "app",
roles: [ { role: "readWrite", db: "app" },
         { role: "read", db: "test" }
 ]
  }
)

查看并测试用户

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show users
db.auth("app","app")

删除用户

删除app用户:先登录到admin数据库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mongo -uroot –proot 127.0.0.1/admin

进入app库删除app用户

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use app
db.dropUser("app")

1.6.4 自定义数据库

创建app数据库的管理员:先登录到admin数据库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use app
db.createUser(
{
user: "admin",
pwd: "admin",
roles: [ { role: "dbAdmin", db: "app" } ]
}
)

创建app数据库读写权限的用户并具有clusterAdmin权限:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use app
db.createUser(
{
user: "app04",
pwd: "app04",
roles: [ { role: "readWrite", db: "app" },
{ role: "clusterAdmin", db: "admin" }
]
}
)

1.7 SQL与MongoDB语言对比

SQL语言与CRUD语言对照

SQL Schema Statements

MongoDB Schema Statements

CREATE TABLE users ( id MEDIUMINT NOT NULL AUTO_INCREMENT, user_id Varchar(30), age Number, status char(1), PRIMARY KEY (id) )

Implicitly created on first insert() operation. The primary key _idis automatically added if _id field is not specified. db.users.insert( { user_id: "abc123", age: 55, status: "A" } ) However, you can also explicitly create a collection: db.createCollection("users")

ALTER TABLE users ADD join_date DATETIME

在Collection 级没有数据结构概念。然而在 document级,可以通过$set在 update操作添加列到文档中。 db.users.update( { }, { $set: { join_date: new Date() } }, { multi: true } )

ALTER TABLE users DROP COLUMN join_date

在Collection 级没有数据结构概念。然而在 document级,可以通过$unset 在update操作从文档中删除列。 db.users.update( { }, { $unset: { join_date: "" } }, { multi: true } )

CREATE INDEX idx_user_id_asc ON users(user_id)

db.users.createIndex( { user_id: 1 } )

CREATE INDEX idx_user_id_asc_age_desc ON users(user_id, age DESC)

db.users.createIndex( { user_id: 1, age: -1 } )

DROP TABLE users

db.users.drop()

插入/删除/更新 语句对比

SQL Statements

MongoDB Statements

INSERT INTO users(user_id, age status) VALUES ("bcd001", 45, "A")

db.users.insert( { user_id: "bcd001", age: 45, status: "A" } )

DELETE FROM users WHERE status = "D"

db.users.remove( { status: "D" } )

DELETE FROM users

db.users.remove({})

UPDATE users SET status = "C" WHERE age > 25

db.users.update( { age: { $gt: 25 } }, { $set: { status: "C" } }, { multi: true } )

UPDATE users SET age = age + 3 WHERE status = "A"

db.users.update( { status: "A" } , { $inc: { age: 3 } }, { multi: true } )

查询类操作对比

SQL SELECT Statements

MongoDB find() Statements

SELECT * FROM users

db.users.find()

SELECT id, user_id, status FROM users

db.users.find( { }, { user_id: 1, status: 1, _id: 0 } )

SELECT user_id, status FROM users

db.users.find( { }, { user_id: 1, status: 1 } )

SELECT * FROM users WHERE status = "A"

db.users.find( { status: "A" } )

SELECT user_id, status FROM users WHERE status = "A"

db.users.find( { status: "A" }, { user_id: 1, status: 1, _id: 0 } )

1.8 错误解决

  在登陆数据库的时候,发现会由描述文件相关的报错。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[mongod@MongoDB mongodb]$ mongo
MongoDB shell version: 3.2.8
connecting to: test
Server has startup warnings: 
2018-01-03T11:08:55.526+0800 I CONTROL  [initandlisten] 
2018-01-03T11:08:55.526+0800 I CONTROL  [initandlisten] ** WARNING: soft rlimits too low. rlimits set to 19193 processes, 65535 files. Number of processes should be at least 32767.5 : 0.5 times number of files.

解决办法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cat >> /etc/security/limits.conf <<EOF
mongod   soft     nofile     32767.5
mongod   soft     nproc      32767.5
EOF

修改后,重启服务器,即可解决该问题。

1.9 参考文献

[1] https://docs.mongodb.com/manual/introduction/ [2] http://www.mongoing.com/docs/introduction.html [3] https://zh.wikipedia.org/ [4] https://docs.mongodb.com/manual/core/security-built-in-roles/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-01-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
MongoDB数据库的基本使用总结
江湖有缘
2023/09/14
1.5K0
MongoDB数据库的基本使用总结
MongoDB 部署
MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是可以应用于各种规模的企业、各个行业以及 各类应用程序的开源数据库。作为一个适用于敏捷开发的数据库,MongoDB的数据模式可以随着应用程序的发 展而灵活地更新。与此同时,它也为开发人员 提供了传统数据库的功能:二级索引,完整的查询系统以及严格 一致性等等。 MongoDB能够使企业更加具有敏捷性和可扩展性,各种规模的企业都可以通过使用MongoDB来 创建新的应用,提高与客户之间的工作效率,加快产品上市时间,以及降低企业成本。
小手冰凉
2020/07/28
1.3K0
MongoDB 部署
听说MongoDB你很豪横?-------------MongoDB数据库基础详解
传统的关系型数据库(如MySQL) ,在数据操作的"三高需求以及应对Web2.0的网站需求面前,显得力不从心。 解释:“三高”需求: ●High performance -对数据库并发读写的需求。 ●Huge Storage -对海量数据的高效率存储和访问的需求。 ●High Scalability & High Availability-对数据库的高可扩展性和高可用性的需求。
不吃小白菜
2020/09/15
1.1K0
MongoDB 使用系列(一)-- 安装
环境 系统:Ubuntu 16.04 MongoDB 版本:3.6 安装 添加软件源 1.添加 MongoDB 签名到 APT $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927 2.创建/etc/apt/sources.list.d/mongodb-org-3.6.list文件并写入命令 Ubuntu 14.04 $ echo "deb [ arch=amd64 ] https://repo.m
木制robot
2018/04/13
1.3K0
MongoDb简介
知识点名 "什么是MongoDB ? MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 分布式系统 分布式系统(distributed system)由多台计算机和通
爱喝水的木子
2022/01/12
3.8K0
MongoDB的备份与恢复
1.1 MongoDB的常用命令 mongoexport / mongoimport mongodump / mongorestore      有以上两组命令在备份与恢复中进行使用。 1.1.1 导出工具mongoexport Mongodb中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件。可以通过参数指定导出的数据项,也可以根据指定的条件导出数据。    该命令的参数如下: 参数 参数说明 -h 指明数据库宿主机的IP
惨绿少年
2018/03/30
4.5K0
MongoDB入门与安装 [纯技术]
mongodb是一个nosql数据库,所有的数据都是以bson格式去存储在数据库里面的,什么是bson呢,bson是一种比json更强的数据存储格式,如果你是小白,可以直接看做json
Jean
2018/10/11
4410
Mongodb基本操作
# /usr/local/mongodb/bin/mongod --dbpath=/usr/local/mongodb/data/ --fork --logpath=/usr/local/mongodb/log/mongodb.log --auth
Lansonli
2021/10/09
4620
MongoDB初了解——用户权限
本文所述MongoDB版本为4.0.5,笔者对MongoDB刚接触,对各个版本的MongoDB不甚了解,本文不对该版本的MongoDB做特性介绍,所涉及命令也许对其余版本不适用。
用户1148394
2019/01/07
1.1K0
Linux 安装 MongoDB
一、下载 Linux:CentOS 7.3 64位 MongoDB:3.6.4 安装目录:/usr/local cd /usr/local wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.6.4.tgz 回到顶部 二、解压缩     解压缩安装包并重命名(方便管理) tar -zxvf mongodb-linux-x86_64-rhel62-3.6.4.tgz mv mongodb-linux-x86_64-rhel62
JMCui
2018/06/14
2.1K0
MongoDB基础
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。在nosql数据库里,大部分的查询都是键值对(key、value)的方式。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中最像关系数据库的。其特征NoSQL、文档存储、Json数据模型、支持事务。
KaliArch
2018/05/30
1.7K2
MongoDB基础
CentOS 7下MongoDB 3.6 的安装及基本操作
1.MongoDB是一款跨平台、面向文档的数据库,可以实现高性能,高可用性,并且能够轻松扩展。MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB可以为Web应用提供可扩展的高性能数据存储解决方案。
星哥玩云
2022/08/17
1.1K0
CentOS 7下MongoDB 3.6 的安装及基本操作
MongoDB副本(一主一备+仲裁)环境部署记录
MongoDB复制集是一个带有故障转移的主从集群。是从现有的主从模式演变而来,增加了自动故障转移和节点成员自动恢复。 MongoDB复制集模式中没有固定的主结点,在启动后,多个服务节点间将自动选举产生一个主结点。该主结点被称为primary,一个或多个从结点被称为secondaries。 primary结点基本上就是master结点,不同之处在于primary结点在不同时间可能是不同的服务器。如果当前的主结点失效了,复制集中的其余结点将会试图选出一个 新的主结点。 MongoDB复制集模式的好处: 一切自动
洗尽了浮华
2018/01/23
3K1
MongoDB副本(一主一备+仲裁)环境部署记录
mongodb主从配置及备份
本文将介绍下mongodb主从配置及备份 ---- MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 主从服务器的实现原理 首先,主节点会把本服务的与写有关的操作记录下来,读操来不记录,这些操作就记录在local数据库中的oplog.$admin这个集合中,这是一个固定集合,大小是可以配置的,主要是通过配
程序员同行者
2018/07/02
1.6K0
Linux下的Mongodb部署应用梳理
一、Mongodb简介  官网地址:http://www.mongodb.org/ MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能 最丰富,最像关系数据库的。它在许多场景下可用于替代传统的关系型数据库或键/值存储方式。它是由C++语言编写的一个基于分布式文件存储的开源数据库系统,它的目的在于为WEB应 用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系型数据
洗尽了浮华
2018/01/22
5.1K0
Linux下的Mongodb部署应用梳理
MongoDB运维与开发(一)
工作方向上的原因,不得不接触部分MongoDB的运维工作,之前有接触过一些MongoDB的内容,基本的运维操作没有什么问题,包括MongoDB的集群搭建、数据分片功能等都测试过。但是时间久了,很多东西不用就忘记了,最近准备出一个系列的MongoDB的运维操作文章,希望把这块儿内容重新拾起来。网上查了查,MongDB讲得好的书也就是<MongoDB权威指南>这本了,但是它引用的MongoDB版本比较旧,所以最好结合着官方文档看,这样收获会更快。MongoDB中文论坛里面也有不少前人总结的好文档,对学习都很有帮助。废话不多说,开始讲述吧!
AsiaYe
2020/11/02
1.4K0
MongoDB运维与开发(三)
今天来看MongoDB的用户相关的内容,用户、权限,这块儿的内容还是比较多的。慢慢来看
AsiaYe
2020/11/03
1.8K0
《MongoDB极简教程》第一章 NoSQL简史 & MongoDB安装&环境配置NoSQLNoSQL 简史CAP定理(CAP theorem)BASEMongoDB 特性&优势文档参考安装&环境配置
MongoDB 是一款开源的文档数据库,并且是业内领先的 NoSQL 数据库,用 C++ 编写而成。
一个会写诗的程序员
2018/08/20
1K0
《MongoDB极简教程》第一章 NoSQL简史 & MongoDB安装&环境配置NoSQLNoSQL 简史CAP定理(CAP theorem)BASEMongoDB 特性&优势文档参考安装&环境配置
Mongodb主从搭建
Mongodb主从搭建 内存2以上 无特殊要求 主IP:192.168.1.100 从IP:192.168.1.101 准备配置如下,每台服务器都执行 sudo echo "never" > /sys/kernel/mm/transparent_hugepage/enabled sudo echo "never" > /sys/kernel/mm/transparent_hugepage/defrag vim /etc/security/limits.conf # 添加mongo用户可以打开的文件数量的
Yuou
2022/09/26
5650
MongoDB快速入门,掌握这些刚刚好!(第一篇)
之后在admin集合中创建一个账号用于连接,这里创建的是基于root角色的超级管理员帐号;整个账号创建过程可以参考下:
用户10002156
2023/12/19
1460
MongoDB快速入门,掌握这些刚刚好!(第一篇)
相关推荐
MongoDB数据库的基本使用总结
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 1.1 数据库管理系统
    • 1.1.1 什么是数据?
    • 1.1.2 什么是数据库管理系统?
    • 1.1.3 常见数据库管理系统?
  • 1.2 NoSQL是什么?
    • 1.2.1 NoSQL简介
    • 1.2.2 NoSQL数据库四大家族
    • 1.2.3 NoSQL的优势
    • 1.2.4 NoSQL与RDBMS对比
  • 1.3 MongoDB简介
    • 1.3.1 MongoDB是什么
    • 1.3.2 MongoDB的特性
    • 1.3.3 关系型数据库与mongodb对比
    • 1.3.4 MongoDB数据存储格式
    • 1.3.5 MongoDB的优势
    • 1.3.6 高可用的复制集群
    • 1.3.7 水平扩展
    • 1.3.8 各存储引擎的对比
    • 1.3.9 数据库功能和性能对比
    • 1.3.10 MongoDB适用场景
    • 1.3.11 MongoDB 慎用场景
    • 1.3.12 什么时候该MongDB
  • 1.4 MongoDB的部署
    • 1.4.1 安装前准备
    • 1.4.2 环境说明
    • 1.4.3 部署MongoDB
    • 1.4.4 管理MongoDB
  • 1.5 MongoDB的基本操作
    • 1.5.1 查询操作
    • 1.5.2 数据管理
  • 1.6 MongoDB中用户管理
    • 1.6.1 用户的权限
    • 1.6.2 创建管理员用户
    • 1.6.3 按生产需求创建应用用户
    • 1.6.4 自定义数据库
  • 1.7 SQL与MongoDB语言对比
  • 1.8 错误解决
  • 1.9 参考文献
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档