數據庫管理系統主要分爲倆大類:RDBMS、NOSQL。在我的電腦、大型計算機和主機上應用最普遍的數據庫管理系統是關係型DBMS。NoSQL是對不一樣於傳統的關係數據庫的數據庫管理系統的統稱。html
二者最重要的不一樣點是NoSQL不使用SQL做爲查詢語言。其數據存儲能夠不須要固定的表格模式,也常常會避免使用SQL的JOIN操做,通常有水平可擴展性的特徵。linux
常見的數據庫管理系統,及其排名狀況以下:git
NoSQL中的四你們族主要是:列存儲、鍵值、圖像存儲、文檔存儲,其類型產品主要有如下這些。github
存儲類型mongodb |
NoSQLshell |
|
鍵值存儲數據庫 |
最終一致性鍵值存儲express |
Cassandra、Dynamo、Riak、Hibari、Virtuoso、Voldemort編程 |
內存鍵值存儲json |
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 |
高可擴展性、分佈式計算、沒有複雜的關係、低成本
架構靈活、半結構化數據
NoSQL |
RDBMS |
表明着不只僅是SQL 沒有聲明性查詢語言 沒有預約義的模式 鍵 - 值對存儲,列存儲,文檔存儲,圖形數據庫 最終一致性,而非ACID屬性 非結構化和不可預知的數據 CAP定理 高性能,高可用性和可伸縮性 |
高度組織化結構化數據 結構化查詢語言(SQL) (SQL) 數據和關係都存儲在單獨的表中。 數據操縱語言,數據定義語言 嚴格的一致性 基礎事務
|
除了上圖所示的3大技術特點還支持:
二級索引、動態查詢、全文搜索 、聚合框架、MapReduce、GridFS、地理位置索引、內存引擎 、地理分佈等一系列的強大功能。
可是其也有些許的缺點,例如:
多表關聯: 僅僅支持Left Outer Join
SQL 語句支持: 查詢爲主,部分支持
多表原子事務: 不支持
多文檔原子事務:不支持
16MB 文檔大小限制,不支持中文排序 ,服務端 Javascript 性能欠佳
存儲方式對比
在傳統的關係型數據庫中,存儲方式是以表的形式存放,而在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. |
JSON 數據格式與語言無關,脫胎於 JavaScript,但目前不少編程語言都支持 JSON 格式數據的生成和解析。JSON 的官方 MIME 類型是 application/json,文件擴展名是 .json。
MongoDB 使用JSON(JavaScript ObjectNotation)文檔存儲記錄。
JSON數據庫語句能夠容易被解析。
Web 應用大量使用,NAME-VALUE 配對
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"});
📢 MongoDB是開源產品
📢 On GitHub Url:https://github.com/mongodb
📢 Licensed under the AGPL,有開源的社區版本
📢 起源& 贊助by MongoDB公司,提供商業版licenses 許可
這些優點造就了mongodb的豐富的功能:
JSON 文檔模型、動態的數據模式、二級索引強大、查詢功能、自動分片、水平擴展、自動複製、高可用、文本搜索、企業級安全、聚合框架MapReduce、大文件存儲GridFS
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 (分片) |
網站數據、緩存等大尺寸、低價值的數據
在高伸縮性的場景,用於對象及JSON數據的存儲。
在下面的表格中進行選擇,但有1個yes的時候:能夠考慮MongoDB;當有2個以上yes的時候:不會後悔的選擇!
應用特徵 |
Yes/No? |
個人數據量是有億萬級或者須要不斷擴容 |
|
須要2000-3000以上的讀寫每秒 |
|
新應用,需求會變,數據模型沒法肯定 |
|
我須要整合多個外部數據源 |
|
個人系統須要99.999%高可用 |
|
個人系統須要大量的地理位置查詢 |
|
個人系統須要提供最小的latency |
|
我要管理的主要數據對象<10 |
慎用場景 |
緣由 |
PB 數據持久存儲大數據分析數據湖 |
Hadoop、Spark提供更多分析運算功能和工具,並行計算能力更強 MongoDB + Hadoop/Spark |
搜索場景:文檔有幾十個字段,須要按照任意字段搜索並排序限制等 |
不建索引查詢太慢,索引太多影響寫入及更新操做 |
ERP、CRM或者相似複雜應用,幾十上百個對象互相關聯 |
關聯支持較弱,事務較弱 |
須要參與遠程事務,或者須要跨表,跨文檔原子性更新的 |
MongoDB 事務支持僅限於本機的單文檔事務 |
100% 寫可用:任什麼時候間寫入不能停 |
MongoDB換主節點時候會有短暫的不可寫設計所限
|
MongoDB官網:https://www.mongodb.com/
CentOS6.X版本軟件下載地址:https://www.mongodb.org/dl/linux/x86_64-rhel62
在安裝以前首先確認該版本軟件是否支持你的操做系統。
更多詳情查看: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 |
✓ |
✓ |
✓ |
✓ |
系統環境說明:
[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
在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數據庫部署完成
數據庫的啓動與關閉
啓動: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信號。
注:該腳本能夠直接在root用戶下運行
[root@MongoDB ~]# cat /etc/init.d/mongod #!/bin/bash # # chkconfig: 2345 80 90 # description:mongodb # by clsn # blog_url http://blog.nmtui.com ################################# MONGODIR=/application/mongodb MONGOD=$MONGODIR/bin/mongod MONGOCONF=$MONGODIR/conf/mongod.conf InfoFile=/tmp/start.mongo . /etc/init.d/functions status(){ PID=`awk 'NR==2{print $NF}' $InfoFile` Run_Num=`ps -p $PID|wc -l` if [ $Run_Num -eq 2 ]; then echo "MongoDB is running" else echo "MongoDB is shutdown" return 3 fi } start() { status &>/dev/null if [ $? -ne 3 ];then action "啓動MongoDB,服務運行中..." /bin/false exit 2 fi sudo su - mongod -c "$MONGOD -f $MONGOCONF" >$InfoFile 2>/dev/null if [ $? -eq 0 ];then action "啓動MongoDB" /bin/true else action "啓動MongoDB" /bin/false fi } stop() { sudo su - mongod -c "$MONGOD -f $MONGOCONF --shutdown" &>/dev/null if [ $? -eq 0 ];then action "中止MongoDB" /bin/true else action "中止MongoDB" /bin/false fi } case "$1" in start) start ;; stop) stop ;; restart) stop sleep 2 start ;; status) status ;; *) echo $"Usage: $0 {start|stop|restart|status}" exit 1 esac
MongoDB的基本操做主要是對數據庫、集合、文檔的操做,包括建立數據庫、刪除數據庫、插入文檔、更改文檔、刪除文檔、和查詢文檔。
Mongodb中關鍵字種類:
db(數據庫實例級別)
db自己
db.connection 數據庫下的集合信息
db.collection.xxx(
rs(複製集級別)
sh(分片級別)
在客戶端指定數據庫進行鏈接:(默認鏈接本機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
建立數據庫
當use的時候,系統就會自動建立一個數據庫。若是use以後沒有建立任何集合。系統就會刪除這個數據庫。
> use clsn;
刪除數據庫
若是沒有選擇任何數據庫,會刪除默認的test數據庫
> show dbs; clsn 0.000GB local 0.000GB test 0.000GB > use clsn switched to db clsn > db.dropDatabase() { "dropped" : "clsn", "ok" : 1 }
建立集合
方法一:
> 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.find({"uid":1}) --這裏指定條件 { "_id" : ObjectId("575f039f0c73a5a96e8f7c8f"), "uid" : 1, "name" : "luotianshuai", "age" : 18, "salary" : 1 }
重命名集合
> 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()
> DBQuery.shellBatchSize=50; # 每頁顯示50條記錄 50 app> db.log.findOne() # 查看第1條記錄 app> db.log.count() # 查詢總的記錄數 app> db.log.find({uid:1000}); # 查詢UUID爲1000的數據 --注:默認每頁顯示20條記錄,當顯示不下的的狀況下,能夠用it迭代命令查詢下一頁數據。
刪除集合中的記錄數
> db.log.distinct("name") # 查詢去掉當前集合中某列的重複數據 [ "mongodb" ] > db.user.remove({"uid":1}) # 刪除文檔 WriteResult({ "nRemoved" : 1 }) # 當removed爲1的時候說明刪除成功 > 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") }
更新文檔這裏經過update方法括號內,第一個文檔是查詢的文檔,第二個文檔是修改成什麼文檔!
> db.user.update({"uid":3},{"uid" : 3, "name" : "shuaige", "salary" : 2000 }) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.findOne({"uid":3}) { "_id" : ObjectId("575f068e0c73a5a96e8f7ca4"), "uid" : 3, "name" : "shuaige", "salary" : 2000 } >
能夠看到這個更新結果是咱們想要的結果,這種方式叫作 文檔的替換方式更新
uid、salary均不須要變動,可是咱們都要寫出來!
變量替換方式
咱們能夠把取出來的值賦值給一個變量,而後經過變量去修改!
#把查詢到的值賦值給a > a = db.user.findOne({"uid":4}) { "_id" : ObjectId("575f068e0c73a5a96e8f7ca5"), "uid" : 4, "name" : "luotianshuai4", "salary" : 7000 } > a.name luotianshuai4
#經過變量.字段名去修改字段的內容 > a.name="dashuaige" dashuaige > db.user.findOne({"uid":4}) { "_id" : ObjectId("575f068e0c73a5a96e8f7ca5"), "uid" : 4, "name" : "luotianshuai4", "salary" : 7000 }
#而後在經過update更新 > db.user.update({"uid":4},a) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.findOne({"uid":4}) { "_id" : ObjectId("575f068e0c73a5a96e8f7ca5"), "uid" : 4, "name" : "dashuaige", "salary" : 7000 }
他的本質仍是替換的方式,只不過是方便了
MongoDB數據庫默認是沒有用戶名及密碼的,即無權限訪問限制。爲了方便數據庫的管理和安全,需建立數據庫用戶。
權限 |
說明 |
Read |
容許用戶讀取指定數據庫 |
readWrite |
容許用戶讀寫指定數據庫 |
dbAdmin |
容許用戶在指定數據庫中執行管理函數,如索引建立、刪除,查看統計或訪問system.profile |
userAdmin |
容許用戶向system.users集合寫入,能夠找指定數據庫裏建立、刪除和管理用戶 |
clusterAdmin |
只在admin數據庫中可用,賦予用戶全部分片和複製集相關函數的管理權限。 |
readAnyDatabase |
只在admin數據庫中可用,賦予用戶全部數據庫的讀權限 |
readWriteAnyDatabase |
只在admin數據庫中可用,賦予用戶全部數據庫的讀寫權限 |
userAdminAnyDatabase |
只在admin數據庫中可用,賦予用戶全部數據庫的userAdmin權限 |
dbAdminAnyDatabase |
只在admin數據庫中可用,賦予用戶全部數據庫的dbAdmin權限。 |
root |
只在admin數據庫中可用。超級帳號,超級權限
|
用戶建立語法
{ user: "<name>", pwd: "<cleartext password>", customData: { <any information> }, roles: [ { role: "<role>", db: "<database>" } | "<role>", ... ] }
語法說明:
user字段:用戶的名字;
pwd字段:用戶的密碼;
cusomData字段:爲任意內容,例如能夠爲用戶全名介紹;
roles字段:指定用戶的角色,能夠用一個空數組給新用戶設定空角色;
role字段:能夠指定內置角色和用戶定義的角色。
進入管理數據庫:> 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
建立對某庫的只讀用戶
--在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")
建立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" } ] } )
mongoimport命令能夠把一個特定格式文件中的內容導入到指定的collection中。該工具能夠導入JSON格式數據,也能夠導入CSV格式的數據。
mongoexport命令能夠把一個collection導出成JSON格式或CSV格式的文件。能夠經過參數指定導出的數據項,也能夠根據指定的條件導出數據。
參數說明:
for(var i=1;i<=100;i++) db.info.insert({"id":i,"name":"jack"+i}) //循環寫入100條數據 mongoexport -d school -c info -o /opt/info.json //導出 mongoimport -d school -c info1 --file /opt/info.json //導入到info集合 mongoexport -d school -c info1 -q '{"id":{"$eq":10}}' -o /opt/top10.json //條件導出指定第10行
備份:mongodump
恢復:mongorestore
參數說明:
mkdir /backup --建立存放目錄 mongodump -d abc -o /backup/ --備份abc數據庫 mongorestore -d abc123 --dir=/backup/abc --恢復到abc123數據庫
>db.copyDatabase("abc","abc1") --複製數據庫abc生成abc1
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 } ) |
--在登錄數據庫的時候,發現會由描述文件相關的報錯。 [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 --修改後,重啓服務器,便可解決該問題。
整理自:https://www.cnblogs.com/clsn/p/8214194.html#auto_id_2一、https://blog.51cto.com/13625810/214748一、https://www.cnblogs.com/luotianshuai/p/5583439.html