在瞭解MongoDB以前須要先了解先數據庫管理系統html
數據(英語:data),是指未通過處理的原始記錄。linux
通常而言,數據缺少組織及分類,沒法明確的表達事物表明的意義,它多是一堆的雜誌、一大疊的報紙、數種的開會記錄或是整本病人的病歷紀錄。數據描述事物的符號記錄,是可定義爲意義的實體,涉及事物的存在形式。是關於事件之一組離散且客觀的事實描述,是構成訊息和知識的原始材料。git
數據庫管理系統(英語:database management system,縮寫:DBMS) 是一種針對對象數據庫,爲管理數據庫而設計的大型電腦軟件管理系統。github
具備表明性的數據管理系統有:Oracle、Microsoft SQL Server、Access、MySQL及PostgreSQL等。一般數據庫管理師會使用數據庫管理系統來建立數據庫系統。sql
現代DBMS使用不一樣的數據庫模型追蹤實體、屬性和關係。在我的電腦、大型計算機和主機上應用最普遍的數據庫管理系統是關係型DBMS(relational DBMS)。在關係型數據模型中,用二維表格表示數據庫中的數據。這些表格稱爲關係。mongodb
數據庫管理系統主要分爲倆大類:RDBMS、NOSQLshell
關於RDBMS的更多信息參考:http://www.cnblogs.com/clsn/category/1131345.html數據庫
常見的數據庫管理系統,及其排名狀況以下:編程
圖 - 數據庫管理系統使用狀況世界排名json
數據來源:https://db-engines.com/en/ranking
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.
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 |
高可擴展性、分佈式計算、沒有複雜的關係、低成本
架構靈活、半結構化數據
NoSQL |
RDBMS |
表明着不只僅是SQL 沒有聲明性查詢語言 沒有預約義的模式 鍵 - 值對存儲,列存儲,文檔存儲,圖形數據庫 最終一致性,而非ACID屬性 非結構化和不可預知的數據 CAP定理 高性能,高可用性和可伸縮性 |
高度組織化結構化數據 結構化查詢語言(SQL) (SQL) 數據和關係都存儲在單獨的表中。 數據操縱語言,數據定義語言 嚴格的一致性 基礎事務 |
MongoDB並不是芒果的意思,而是源於 Humongous(巨大)一詞。
MongoDB的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格式
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"});
📢 MongoDB是開源產品
📢 On GitHub Url:https://github.com/mongodb
📢 Licensed under the AGPL,有開源的社區版本
📢 起源& 贊助by MongoDB公司,提供商業版licenses 許可
這些優點造就了mongodb的豐富的功能:
JSON 文檔模型、動態的數據模式、二級索引強大、查詢功能、自動分片、水平擴展、自動複製、高可用、文本搜索、企業級安全、聚合框架MapReduce、大文件存儲GridFS
自動複製和故障切換
多數據中心支持滾動維護無需關機支持最多50個成員
這種方式是目前構架上的主流形式,指的是經過增長服務器數量來對系統擴容。在這樣的構架下,單臺服務器的配置並不會很高,多是配置比較低、很廉價的 PC,每臺機器承載着系統的一個子集,全部機器服務器組成的集羣會比單體服務器提供更強大、高效的系統容載量。
這樣的問題是系統構架會比單體服務器複雜,搭建、維護都要求更高的技術背景。分片集羣架構以下圖所示:
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 (分片) |
由下圖能夠看出MongoDB數據庫的性能擴展能力及功能都較好,都可以在數據庫中,站立一足之地。
網站數據、緩存等大尺寸、低價值的數據
在高伸縮性的場景,用於對象及JSON數據的存儲。
慎用場景 |
緣由 |
PB 數據持久存儲大數據分析數據湖 |
Hadoop、Spark提供更多分析運算功能和工具,並行計算能力更強 MongoDB + Hadoop/Spark |
搜索場景:文檔有幾十個字段,須要按照任意字段搜索並排序限制等 |
不建索引查詢太慢,索引太多影響寫入及更新操做 |
ERP、CRM或者相似複雜應用,幾十上百個對象互相關聯 |
關聯支持較弱,事務較弱 |
須要參與遠程事務,或者須要跨表,跨文檔原子性更新的 |
MongoDB 事務支持僅限於本機的單文檔事務 |
100% 寫可用:任什麼時候間寫入不能停 |
MongoDB換主節點時候會有短暫的不可寫設計所限 |
應用特徵 |
Yes/No? |
個人數據量是有億萬級或者須要不斷擴容 |
|
須要2000-3000以上的讀寫每秒 |
|
新應用,需求會變,數據模型沒法肯定 |
|
我須要整合多個外部數據源 |
|
個人系統須要99.999%高可用 |
|
個人系統須要大量的地理位置查詢 |
|
個人系統須要提供最小的latency |
|
我要管理的主要數據對象<10 |
在上面的表格中進行選擇,但有1個yes的時候:能夠考慮MongoDB;當有2個以上yes的時候:不會後悔的選擇!
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信號。
使用腳本管理mongodb服務
注:該腳本能夠直接在root用戶下運行
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 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") }
MongoDB數據庫默認是沒有用戶名及密碼的,即無權限訪問限制。爲了方便數據庫的管理和安全,需建立數據庫用戶。
用戶中權限的說明
權限 |
說明 |
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 字段:能夠指定內置角色和用戶定義的角色。
進入管理數據庫
> 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" } ] } )
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 } ) |