MongoDB基礎
1.1 MongoDB概念
MongoDB 是由C++語言編寫的,是一個基於分布式文件存儲的開源數據庫系統。在高負載的情況下,添加更多的節點,可以保證服務器性能。MongoDB 旨在為WEB應用提供可擴展的高性能數據存儲解決方案。MongoDB 將數據存儲為一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔類似於 JSON 對象。字段值可以包含其他文檔,數組及文檔數組。在nosql數據庫裏,大部分的查詢都是鍵值對(key、value)的方式。MongoDB是一個介於關系數據庫和非關系數據庫之間的產品,是非關系數據庫當中最像關系數據庫的。其特征NoSQL、文檔存儲、Json數據模型、支持事務。
1.2 NoSQL概念
NoSQL,指的是非關系型的數據庫。NoSQL有時也稱作Not Only SQL的縮寫,是對不同於傳統的關系型數據庫的數據庫管理系統的統稱。
NoSQL用於超大規模數據的存儲。(例如谷歌或Facebook每天為他們的用戶收集萬億比特的數據)。這些類型的數據存儲不需要固定的模式,無需多余操作就可以橫向擴展。
1.3 NoSQL的特征
高擴展性:Nosql去掉了關系數據庫的關系型特性,易於橫向擴展。
高性能:Nosql通過簡單的key-value方式獲取數據,非常快速。還有NoSQL的Cache是記錄級的,是一種細粒度的Cache,所以NoSQL在這個層面上來說就要性能高很多。
靈活的數據模型
高可用:NoSQL在不太影響性能的情況,就可以方便的實現高可用的架構。比如mongodb通過mongos、config server replica set,shard就可以快速配置出高可用配置。
1.4 NoSQL分類
類型 | 部分代表 | 特點 |
列存儲 | Hbase Cassandra Hypertable | 顧名思義,是按列存儲數據的。最大的特點是方便存儲結構化和半結構化數據,方便做數據壓縮,對針對某一列或者某幾列的查詢有非常大的IO優勢。 |
文檔存儲 | MongoDB CouchDB | 文檔存儲一般用類似json的格式存儲,存儲的內容是文檔型的。這樣也就有有機會對某些字段建立索引,實現關系數據庫的某些功能。 |
key-value存儲 | Tokyo Cabinet / Tyrant Berkeley DB MemcacheDB Redis | 可以通過key快速查詢到其value。一般來說,存儲不管value的格式,照單全收。(Redis包含了其他功能) |
圖存儲 | Neo4J FlockDB | 圖形關系的最佳存儲。使用傳統關系數據庫來解決的話性能低下,而且設計使用不方便。 |
對象存儲 | db4o Versant | 通過類似面向對象語言的語法操作數據庫,通過對象的方式存取數據。 |
xml數據庫 | Berkeley DB XML BaseX | 高效的存儲XML數據,並支持XML的內部查詢語法,比如XQuery,Xpath。 |
1.5 MongoDB概念解析
在mongodb中基本的概念是文檔、集合、數據庫,對應與關系型數據庫如下表:
SQL術語/概念 | MongoDB術語/概念 | 解釋/說明 |
---|---|---|
database | database | 數據庫 |
table | collection | 數據庫表/集合 |
row | document | 數據記錄行/文檔 |
column | field | 數據字段/域 |
index | index | 索引 |
table joins | 表連接,MongoDB不支持 | |
primary key | primary key | 主鍵,MongoDB自動將_id字段設置為主鍵 |
數據庫:一個MongoDB 實例可以承載多個數據庫。它們之間可以看作相互獨立,每個數據庫都有獨立的權限控制。在磁盤上,不同的數據庫存放在不同的文件中。MongoDB 中存在以下系統數據庫。
Admin 數據庫:一個權限數據庫,如果創建用戶的時候將該用戶添加到admin 數據庫中,那麽該用戶就自動繼承了所有數據庫的權限。
Local 數據庫:這個數據庫永遠不會被負責,可以用來存儲本地單臺服務器的任意集合。
Config 數據庫:當MongoDB 使用分片模式時,config 數據庫在內部使用,用於保存分片的信息。
集合:集合就是一組文檔,類似於關系數據庫中的表。集合是無模式的,集合中的文檔可以是各式各樣的。在MongoDB中集合用collections表示,每個
collection用一個名字標識,需要註意以下幾點:
名字不允許是空字符串""
名字不能包含\0字符,因為它表示名字的結束
不能創建以system.開頭的
文檔:文檔是 MongoDB 中數據的基本單位,類似於關系數據庫中的行(但是比行復雜)。多個鍵及其關聯的值有序地放在一起就構成了文檔。
文檔中的鍵/值對是有序的。
文檔中的值不僅可以是在雙引號裏面的字符串,還可以是其他幾種數據類型(甚至可以是整個嵌入的文檔)。
MongoDB區分類型和大小寫。
MongoDB的文檔不能有重復的鍵。
文檔的鍵是字符串。除了少數例外情況,鍵可以使用任意UTF-8字符。
二、安裝部署
2.1 配置yum安裝
配置mongodb的yum源進行安裝
cat >/etc/yum.repos.d/mongodb.repo<<EOF [mongodb] name=MongoDB Repository baseurl= gpgcheck=0 enabled=1 EOF yum clean all && yum makecache yum install -y mongo-10gen mongo-10gen-server
2.2 下載安裝包安裝
cd /usr/local/ wget -c https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.4.10.tgz #下載軟件包 tar -zxvf mongodb-linux-x86_64-rhel62-3.4.10.tgz ln -sv mongodb-linux-x86_64-rhel62-3.4.10 mongodb mkdir /usr/local/mongodb/{conf,mongoData,mongoLog} #創建數據,日誌,配置文件目錄 touch /usr/local/mongodb/mongoLog/mongodb.log #創建日誌文件 echo "PATH=$PAHT:/usr/local/mongodb/bin">/etc/profile.d/mongodb.sh source etc/profile.d/mongodb.sh #配置環境變量
命令行啟動:
mongod --httpinterface --dbpath /usr/local/mongodb/mongoData --logpath /usr/local/mongodb/mongoLog/mongodb.log --fork
將啟動的各項參數寫入配置文件啟動
cat>/usr/local/mongodb/conf/mongodb.conf<<EOF dbpath=/usr/local/mongodb/mongoData #數據存儲目錄 logpath=/usr/local/mongodb/mongoLog/mongodb.log #日誌文件 logappend=true # 使用追加的方式寫日誌 journal=true quiet=true port=27017 #端口 maxConns=20000 #最大連接數 httpinterface=true #開啟web界面端口為:28017 fork=true #以守護進程的方式運行MongoDB EOF mongod -f /usr/local/mongodb/conf/mongodb.conf #指定配置文件啟動
c
2.3 mongod配置參數詳解
--quiet | # 安靜輸出 |
--port arg | # 指定服務端口號,默認端口27017 |
--bind_ip arg | # 綁定服務IP,若綁定127.0.0.1,則只能本機訪問,不指定默認本地所有IP |
--logpath arg | # 指定MongoDB日誌文件,註意是指定文件不是目錄 |
--logappend | # 使用追加的方式寫日誌 |
--pidfilepath arg | # PID File 的完整路徑,如果沒有設置,則沒有PID文件 |
--keyFile arg | # 集群的私鑰的完整路徑,只對於Replica Set 架構有效 |
--unixSocketPrefix arg | # UNIX域套接字替代目錄,(默認為 /tmp) |
--fork | # 以守護進程的方式運行MongoDB,創建服務器進程 |
--auth | # 啟用驗證 |
--cpu | # 定期顯示CPU的CPU利用率和iowait |
--dbpath arg | # 指定數據庫路徑 |
--diaglog arg | # diaglog選項 0=off 1=W 2=R 3=both 7=W+some reads |
--directoryperdb | # 設置每個數據庫將被保存在一個單獨的目錄 |
--journal | # 啟用日誌選項,MongoDB的數據操作將會寫入到journal文件夾的文件裏 |
--journalOptions arg | # 啟用日誌診斷選項 |
--ipv6 | # 啟用IPv6選項 |
--jsonp | # 允許JSONP形式通過HTTP訪問(有安全影響) |
--maxConns arg | # 最大同時連接數 默認2000 |
--noauth | # 不啟用驗證 |
--nohttpinterface | # 關閉http接口,默認關閉27018端口訪問 |
--noprealloc | # 禁用數據文件預分配(往往影響性能) |
--noscripting | # 禁用腳本引擎 |
--notablescan | # 不允許表掃描 |
--nounixsocket | # 禁用Unix套接字監聽 |
--nssize arg (=16) | # 設置信數據庫.ns文件大小(MB) |
--objcheck | # 在收到客戶數據,檢查的有效性, |
--profile arg | # 檔案參數 0=off 1=slow, 2=all |
--quota | # 限制每個數據庫的文件數,設置默認為8 |
--quotaFiles arg | # number of files allower per db, requires --quota |
--rest | # 開啟簡單的rest API |
--repair | # 修復所有數據庫run repair on all dbs |
--repairpath arg | # 修復庫生成的文件的目錄,默認為目錄名稱dbpath |
--slowms arg (=100) | # value of slow for profile and console log |
--smallfiles | # 使用較小的默認文件 |
--syncdelay arg (=60) | # 數據寫入磁盤的時間秒數(0=never,不推薦) |
--sysinfo | # 打印一些診斷系統信息 |
--upgrade | # 如果需要升級數據庫 |
* Replicaton 參數
--fastsync | # 從一個dbpath裏啟用從庫復制服務,該dbpath的數據庫是主庫的快照,可用於快速啟用同步 |
--autoresync | # 如果從庫與主庫同步數據差得多,自動重新同步, |
--oplogSize arg | # 設置oplog的大小(MB) |
* 主/從參數
--master | # 主庫模式 |
--slave | # 從庫模式 |
--source arg | # 從庫 端口號 |
--only arg | # 指定單一的數據庫復制 |
--slavedelay arg | # 設置從庫同步主庫的延遲時間 |
* Replica set(副本集)選項:
--replSet arg | # 設置副本集名稱 |
* Sharding(分片)選項
--configsvr | # 聲明這是一個集群的config服務,默認端口27019,默認目錄/data/configdb |
--shardsvr | # 聲明這是一個集群的分片,默認端口27018 |
--noMoveParanoia | # 關閉偏執為moveChunk數據保存 |
三、基礎操作
3.1 數據庫操作
a.創建數據庫
MongoDB 創建數據庫的語法格式如下:
use DATABASE_NAME #如果數據庫不存在,則創建數據庫,否則切換到指定數據庫。
use dbtest; > db dbtest > show dbs; #查看數據庫 admin 0.000GB dbtest 0.000GB local 0.000GB
b.刪除數據庫
MongoDB 刪除數據庫的語法格式如下:
db.dropDatabase()
> use dbtest; switched to db dbtest > db.dropDatabase() { "dropped" : "dbtest", "ok" : 1 } > show dbs; admin 0.000GB local 0.000GB
3.2 集合操作
a.創建集合
db.createCollection(name,options)
db.createCollection("user",autoindexID=true)
capped:類型為 Boolean,如果為 true 則創建一個固定大小的集合,當其條目達到最大時可以自動覆蓋以前的條目。在設置其為 true 時也要指定參數大小;
autoIndexID:類型為 Boolean,默認為 false,如果設置為 true,則會在 _id field.s 上自動創建索引;
size:如果 capped 為 true 需要指定,指定參數的最大值,單位為 byte;
max:指定最大的文檔數。 在 Mongodb 中也可以不用創建集合,因為在創建文檔的時候也會自動的創建集合。
> db.createCollection("user",autoindexID=true) #創建集合user { "ok" : 1 } > show collections; #查看集合 user
b.刪除集合
db.collection.drop()
> show collections; user > db.user.drop() true > show collections
3.3 文檔操作
a.插入文檔
MongoDB 使用 insert() 或 save() 方法向集合中插入文檔
db.COLLECTION_NAME.insert(document)
> db.user.insert({name:"kaliarch",age:30}) #insert 插入文檔 WriteResult({ "nInserted" : 1 }) > db.user.insert({name:"xuel",age:31}) WriteResult({ "nInserted" : 1 }) > db.user.save({name:"anchnet",age:34}) #save插入文檔 WriteResult({ "nInserted" : 1 }) > db.user.find() #查看文檔 { "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 } { "_id" : ObjectId("5a1a870cceffdd1c65f633ef"), "name" : "xuel", "age" : 31 } { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 }
db.collection.insertOne():向指定集合中插入一條文檔數據
db.collection.insertMany():向指定集合中插入多條文檔數據
b.更新文檔
MongoDB 使用 update() 和 save() 方法來更新集合中的文檔
--------------------------------------update方式-----------------------------------------
update()方式 db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> })
參數說明:
query : update的查詢條件,類似sql update查詢內where後面的。
update : update的對象和一些更新的操作符(如$,$inc...)等,也可以理解為sql update查詢內set後面的
upsert : 可選,這個參數的意思是,如果不存在update的記錄,是否插入objNew,true為插入,默認是false,不插入。
multi : 可選,mongodb 默認是false,只更新找到的第一條記錄,如果這個參數為true,就把按條件查出來多條記錄全部更新。
writeConcern :可選,拋出異常的級別。
> db.user.find() { "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 } { "_id" : ObjectId("5a1a870cceffdd1c65f633ef"), "name" : "xuel", "age" : 31 } { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 } > db.user.update({"name":"xuel"},{$set:{"name":"udxuel"}}) #更新name WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.find() { "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 } { "_id" : ObjectId("5a1a870cceffdd1c65f633ef"), "name" : "udxuel", "age" : 31 } { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 }
-----------------------------------------save方式--------------------------------------
save()方式 db.collection.save( <document>, { writeConcern: <document> })
參數說明:
document : 文檔數據。
writeConcern :可選,拋出異常的級別。
> db.user.find() { "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 } { "_id" : ObjectId("5a1a870cceffdd1c65f633ef"), "name" : "udxuel", "age" : 31 } { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 } > db.user.save({ "_id" : ObjectId("5a1a870cceffdd1c65f633ef"), "name" : "xuel", "age" : 31 }) #更新name WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.find() { "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 } { "_id" : ObjectId("5a1a870cceffdd1c65f633ef"), "name" : "xuel", "age" : 31 } { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 }
c.刪除文檔
remove() 方法的基本語法格式如下:
db.collection.remove( <query>, { justOne: <boolean>, writeConcern: <document> })
參數說明:
query :(可選)刪除的文檔的條件。
justOne : (可選)如果設為 true 或 1,則只刪除一個文檔。
writeConcern :(可選)拋出異常的級別。
> db.user.find() { "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 } { "_id" : ObjectId("5a1a870cceffdd1c65f633ef"), "name" : "xuel", "age" : 31 } { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 } > db.user.remove({"name":"xuel","age":31}) #刪除文檔 WriteResult({ "nRemoved" : 1 }) > db.user.find() { "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 } { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 }
d.查看文檔
db.collection.find(query, projection)
query :可選,使用查詢操作符指定查詢條件
projection :可選,使用投影操作符指定返回的鍵。查詢時返回文檔中所有鍵值, 只需省略該參數即可(默認省略)。
可以使用 pretty() 方法,語法格式如下:
> db.user.find() { "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 } { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 } > db.user.find().pretty() { "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 } { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 }
3.3 條件操作符
條件操作符用於比較兩個表達式並從mongoDB集合中獲取數據
(>) 大於 - $gt
(<) 小於 - $lt
(>=) 大於等於 - $gte
(<= ) 小於等於 - $lte
(=)等於- $eq
(!=)不等於-$ne
> db.user.find() { "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 } { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 } { "_id" : ObjectId("5a1a8ddeceffdd1c65f633f1"), "name" : "test", "age" : 50 } > db.user.find({"age":{$gt:33}}) #查詢age大於33的文檔 { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 } { "_id" : ObjectId("5a1a8ddeceffdd1c65f633f1"), "name" : "test", "age" : 50 } > db.user.find({"age":{$lt:33}}) #查詢age小於33的文檔 { "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 } > db.user.find({"age":{$eq:34}}) #查詢age等於33的文檔 { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 } > db.user.find({"age":{$ne:10}}) 、#查詢age不等於10的文檔 { "_id" : ObjectId("5a1a8704ceffdd1c65f633ee"), "name" : "kaliarch", "age" : 30 } { "_id" : ObjectId("5a1a8729ceffdd1c65f633f0"), "name" : "anchnet", "age" : 34 } { "_id" : ObjectId("5a1a8ddeceffdd1c65f633f1"), "name" : "test", "age" : 50
MongoDB基礎