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.tgz1.4.3 部署MongoDB
在root用戶下操作
cat >> /etc/rc.local <<'EOF' if test -f /sys/kernel/mm/transparent_hugepage/enabled; thenecho never > /sys/kernel/mm/transparent_hugepage/enabled fi if test -f /sys/kernel/mm/transparent_hugepage/defrag; thenecho 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 --shutdownYAML格式配置文件(3.X?版本官方推薦使用)
[mongod@MongoDB conf]$ cat mongod.conf systemLog:destination: filepath: "/application/mongodb/log/mongod.log"logAppend: true storage:journal:enabled: truedbPath: "/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.11.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.version1.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
[3]??https://zh.wikipedia.org/
[4]??https://docs.mongodb.com/manual/core/security-built-in-roles/
#cnblogs_post_body{color:black;font:0.875em/1.5em"微軟雅黑" , "PTSans" , "Arial" ,sans-serif;font-size:15px;}#cnblogs_post_bodyh1{background:#333366;border-radius:6px6px6px6px;box-shadow:0001px#5F5A4B, 1px1px6px1pxrgba(10, 10, 0, 0.5);color:#FFFFFF;font-family:"微軟雅黑" , "宋體" , "黑體" ,Arial;font-size:23px;font-weight:bold;height:25px;line-height:25px;margin:18px0;padding:8px05px5px;text-shadow:2px2px3px#222222;}#cnblogs_post_bodyh2{background:#006699;border-radius:6px6px6px6px;box-shadow:0001px#5F5A4B, 1px1px6px1pxrgba(10, 10, 0, 0.5);color:#FFFFFF;font-family:"微軟雅黑" , "宋體" , "黑體" ,Arial;font-size:20px;font-weight:bold;height:25px;line-height:25px;margin:18px0;padding:8px05px5px;text-shadow:2px2px3px#222222;}#cnblogs_post_bodyh3{background:#2B6695;border-radius:6px6px6px6px;box-shadow:0001px#5F5A4B, 1px1px6px1pxrgba(10, 10, 0, 0.5);color:#FFFFFF;font-family:"微軟雅黑" , "宋體" , "黑體" ,Arial;font-size:18px;font-weight:bold;height:25px;line-height:25px;margin:18px0;padding:8px05px5px;text-shadow:2px2px3px#222222;}#cnblogs_post_bodyh4{background:#2B6600;border-radius:6px6px6px6px;box-shadow:0001px#5F5A4B, 1px1px6px1pxrgba(10, 10, 0, 0.5);color:#FFFFFF;font-family:"微軟雅黑" , "宋體" , "黑體" ,Arial;font-size:16px;font-weight:bold;height:24px;line-height:23px;margin:12px0;padding:5px05px10px;text-shadow:2px2px3px#222222;}
轉載于:https://www.cnblogs.com/gaoyuechen/p/8946574.html
總結
以上是生活随笔為你收集整理的MongoDB 入门篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 单点登录与权限管理本质:cookie安全
- 下一篇: 负载均衡服务器nginx详细安装教程及网