03 分佈式 08 mangodb:MongoDB 入門篇

1.1 數據庫管理系統

 

    在瞭解MongoDB之前需要先了解先數據庫管理系統

1.1.1 什麼是數據?

  數據(英語:data),是指未經過處理的原始記錄。

  一般而言,數據缺乏組織及分類,無法明確的表達事物代表的意義,它可能是一堆的雜誌、一大疊的報紙、數種的開會記錄或是整本病人的病歷紀錄。數據描述事物的符號記錄,是可定義爲意義的實體,涉及事物的存在形式。是關於事件之一組離散且客觀的事實描述,是構成訊息和知識的原始材料。

1.1.2 什麼是數據庫管理系統?

  數據庫管理系統(英語:database management system,縮寫:DBMS) 是一種針對對象數據庫,爲管理數據庫而設計的大型電腦軟件管理系統。

  具有代表性的數據管理系統有:Oracle、Microsoft SQL Server、Access、MySQL及PostgreSQL等。通常數據庫管理師會使用數據庫管理系統來創建數據庫系統。

  現代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形式存放

例如:

> 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 環境說明

系統環境說明:

[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

軟件版本說明

本次使用的mongodb版本爲:mongodb-linux-x86_64-3.2.8.tgz

1.4.3 部署MongoDB

在root用戶下操作

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的最佳性能。

創建用戶

groupadd -g 800 mongod
useradd  -u 801 -g mongod  mongod

  修改用戶密碼

echo 123456 |passwd --stdin  mongod

創建程序目錄

mkdir -p /application/mongodb/   &&\
cd  /application/mongodb/   &&\
mkdir  -p  bin  conf  log  data

下載程序

cd  /application/mongodb/
wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.8.tgz

解壓程序

tar xf  mongodb-linux-x86_64-3.2.8.tgz
cd mongodb-linux-x86_64-3.2.8/bin/ &&\
cp * /mongodb/bin

修改程序屬主

chown -R mongod:mongod /application/mongodb

  切換到mongod用戶,設置用戶環境變量

su - mongod
cat >> .bash_profile <<'EOF'
export PATH=/mongodb/bin:$PATH
EOF
source .bashprofile

     至此,MongoDB數據庫部署完成

1.4.4 管理MongoDB

  數據庫的啓動與關閉

啓動: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

關閉數據庫

登入數據庫

[mongod@MongoDB ~]$ mongo
MongoDB shell version: 3.2.8
connecting to: test
>

使用配置文件的方式管理數據庫:

  普通格式配置文件

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

   使用配置文件時的啓動與關閉:

啓動:mongod -f mongod1.conf 
關閉:mongod -f mongod1.conf  --shutdown

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

[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

在數據庫中關閉數據庫的方法

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命令關閉進程

$ kill -2 PID
  原理:-2表示向mongod進程發送SIGINT信號。
或
$ kill -4 PID
  原理:-4表示向mognod進程發送SIGTERM信號。

使用腳本管理mongodb服務

   注:該腳本可以直接在root用戶下運行

 View Code 腳本管理mongodb服務 

1.5 MongoDB的基本操作

Mongodb中關鍵字種類:

db(數據庫實例級別)

         db本身

             db.connection 數據庫下的集合信息

                 db.collection.xxx(

rs(複製集級別)

 

sh(分片級別)

1.5.1 查詢操作

在客戶端指定數據庫進行連接:(默認連接本機test數據庫)

[mongod@MongoDB ~]$ mongo 10.0.0.152/admin
MongoDB shell version: 3.2.8
connecting to: 10.0.0.152/admin
> db
admin

查看當前數據庫版本

> db.version()
3.2.8

切換數據庫

> use test;
switched to db test

顯示當前數據庫

> db
test
> db.getName()
test

查詢所有數據庫

> show dbs;
clsn   0.000GB
local  0.000GB
test   0.000GB
> show databases;
clsn   0.000GB
local  0.000GB
test   0.000GB

查看clsn數據庫當前狀態

> use clsn;
> db.stats()
{
    "db" : "clsn",
    "collections" : 1,
    "objects" : 10000,
    "avgObjSize" : 80,
    "dataSize" : 800000,
    "storageSize" : 258048,
    "numExtents" : 0,
    "indexes" : 1,
    "indexSize" : 94208,
    "ok" : 1
}

查看當前數據庫的連接機器地址

> db.getMongo()
connection to 127.0.0.1

1.5.2 數據管理

創建數據庫

> use clsn;

說明:

創建數據庫:

當use的時候,系統就會自動創建一個數據庫。

如果use之後沒有創建任何集合。系統就會刪除這個數據庫。

刪除數據庫

> show dbs;
clsn   0.000GB
local  0.000GB
test   0.000GB
> use clsn 
switched to db clsn
> db.dropDatabase()
{ "dropped" : "clsn", "ok" : 1 }

說明:

刪除數據庫:

 

  如果沒有選擇任何數據庫,會刪除默認的test數據庫

創建集合

   方法一:

> use clsn;
switched to db clsn
> db.createCollection('a')
{ "ok" : 1 }
> db.createCollection('b')
{ "ok" : 1 }

   查看當前數據下的所有集合

> show collections;
a
b
> db.getCollectionNames()
[ "a", "b" ]

方法二:

  當插入一個文檔的時候,一個集合就會自動創建。

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

   查看創建的合集

> db.getCollectionNames()
[ "a", "b", "c" ]

   查看合集裏的內容

> db.c.find()
{ "_id" : ObjectId("5a4cbcea83ec78b7bea904f8"), "name" : "clsn" }
{ "_id" : ObjectId("5a4cbcfc83ec78b7bea904f9"), "url" : "http://blog.nmtui.com" }

重命名集合

> db.c.renameCollection("clsn")
{ "ok" : 1 }
> db.getCollectionNames()
[ "a", "b", "clsn" ]

   刪除合集

> db.a.drop()
true
> db.getCollectionNames()
[ "b", "clsn" ]

   插入1w行數據

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

查詢集合中的查詢所有記錄

> db.log.find()

注:默認每頁顯示20條記錄,當顯示不下的的情況下,可以用it迭代命令查詢下一頁數據。

> DBQuery.shellBatchSize=50;    # 每頁顯示50條記錄
50 
app> db.log.findOne()            # 查看第1條記錄
app> db.log.count()              # 查詢總的記錄數
app> db.log.find({uid:1000});    # 查詢UUID爲1000的數據

刪除集合中的記錄數

>  db.log.distinct("name")      #  查詢去掉當前集合中某列的重複數據
[ "mongodb" ]
> db.log.remove({})             #  刪除集合中所有記錄
WriteResult({ "nRemoved" : 10000 })  
> db.log.distinct("name")
[ ]

查看集合存儲信息

> db.log.stats()          # 查看數據狀態
> db.log.dataSize()       # 集合中數據的原始大小
> db.log.totalIndexSize() # 集合中索引數據的原始大小
> db.log.totalSize()      # 集合中索引+數據壓縮存儲之後的大小
> db.log.storageSize()    # 集合中數據壓縮存儲的大小

pretty()使用

> 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/

用戶創建語法  

{
user: "<name>", 
pwd: "<cleartext password>", 
customData: { <any information> }, 
roles: [ 
{ role: "<role>", 
db: "<database>" } | "<role>", 
... 
] 
}

語法說明:

user字段:用戶的名字;

pwd字段:用戶的密碼;

cusomData字段:爲任意內容,例如可以爲用戶全名介紹;

roles字段:指定用戶的角色,可以用一個空數組給新用戶設定空角色;

 

roles 字段:可以指定內置角色和用戶定義的角色。

1.6.2 創建管理員用戶

進入管理數據庫

> use admin

創建管理用戶,root權限

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

注意:

     創建管理員角色用戶的時候,必須到admin下創建。

 

     刪除的時候也要到相應的庫下操作。

查看創建完用戶後的collections;

 > show tables; 
system.users  # 用戶存放位置
system.version

查看創建的管理員用戶

    > show users
    {
        "_id" : "admin.root",
        "user" : "root",
        "db" : "admin",
        "roles" : [
            {
                "role" : "root",
                "db" : "admin"
            }
        ]
    }

驗證用戶是否能用

> db.auth("root","root")
1  # 返回 1 即爲成功

用戶創建完成後在配置文件中開啓用戶驗證

cat >>/application/mongodb/conf/mongod.conf<<-'EOF'
security:
  authorization: enabled
EOF

重啓服務

/etc/init.d/mongod  restart

  登陸測試,注意登陸時選擇admin數據庫

    注意:用戶在哪個數據庫下創建的,最後加上什麼庫。

方法一:命令行中進行登陸

[mongod@MongoDB ~]$ mongo -uroot -proot admin 
MongoDB shell version: 3.2.8
connecting to: admin
> 

方法二:在數據庫中進行登陸驗證:

[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

use test
db.createUser(
  {
    user: "test",
    pwd: "test",
    roles: [ { role: "read", db: "test" } ]
  }
)

   測試用戶是否創建成功

db.auth("test","test")
show  users;

登錄test用戶,並測試是否只讀

show collections;
db.createCollection('b')

創建某庫的讀寫用戶

  創建test1用戶,權限爲讀寫

db.createUser(
  {
    user: "test1",
    pwd: "test1",
    roles: [ { role: "readWrite", db: "test" } ]
  }
)

   查看並測試用戶

show users;
db.auth("test1","test1")

創建對多庫不同權限的用戶

   創建對app爲讀寫權限,對test庫爲只讀權限的用戶

use app
db.createUser(
  {
    user: "app",
    pwd: "app",
roles: [ { role: "readWrite", db: "app" },
         { role: "read", db: "test" }
 ]
  }
)

查看並測試用戶

show users
db.auth("app","app")

刪除用戶

   刪除app用戶:先登錄到admin數據庫

mongo -uroot –proot 127.0.0.1/admin

   進入app庫刪除app用戶

use app
db.dropUser("app")

1.6.4 自定義數據庫

創建app數據庫的管理員:先登錄到admin數據庫

use app
db.createUser(
{
user: "admin",
pwd: "admin",
roles: [ { role: "dbAdmin", db: "app" } ]
}
)

創建app數據庫讀寫權限的用戶並具有clusterAdmin權限:

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 錯誤解決

  在登陸數據庫的時候,發現會由描述文件相關的報錯。

[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.

解決辦法:

cat >> /etc/security/limits.conf <<EOF
mongod   soft     nofile     32767.5
mongod   soft     nproc      32767.5
EOF

   修改後,重啓服務器,即可解決該問題。

1.9 參考文獻

 

作者:慘綠少年
出處:http://clsn.io
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章