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用戶下運行
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 參考文獻
[1] https://docs.mongodb.com/manual/introduction/
[2] http://www.mongoing.com/docs/introduction.html
[4] https://docs.mongodb.com/manual/core/security-built-in-roles/
出處:http://clsn.io
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。