1、簡介
MongoDB 是一個基於分佈式文件存儲的數據庫。由C++語言編寫。旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。
MongoDB 是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。它支持的數據結構很是鬆散,是相似json的bson格式,所以能夠存儲比較複雜的數據類型。Mongo最大的特色是它支持的查詢語言很是強大,其語法有點相似於面向對象的查詢語言,幾乎能夠實現相似關係數據庫單表查詢的絕大部分功能,並且還支持對數據創建索引。mysql
2、什麼是mongodb
1.mongodb是有C++語言編寫,是一個機遇分佈式文件存儲的開源數據庫系統。
2.在高負載的狀況下,隨時添加更多的節點,能夠保證服務器性能。
3.mongodb旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。
4.mongodb將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。
5.mongodb文檔相似於json對象,字段值能夠包含其餘文檔,數組及文檔數組。linux
3、mongodb的優缺點sql
優勢:
文檔結構的存儲方式,可以更便捷的獲取數據
內置GridFS,支持大容量存儲
海量數據下,性能優越
動態查詢
全索引支持,擴展到內部對象和內嵌數組
查詢記錄分析
快速,就地更新
高效存儲二進制大對象(照片,視頻等等)
複製(副本集)和支持自動故障恢復
內置Auto-Sharding 自動分片支持雲集擴展性,分片簡單
MapReduce 支持複雜聚合
缺點:
不支持事務操做
MongoDB 佔用空間過大 (不過這個肯定對於目前快速下跌的硬盤價格來講,也不算什麼缺點了)
MongoDB沒有如MySQL那樣成熟的維護工具
沒法進行關聯表查詢,不適用於關係多的數據
複雜聚合操做經過mapreduce建立,速度慢
模式自由,自由靈活的文件存儲格式帶來的數據錯
MongoDB 在你刪除記錄後不會在文件系統回收空間。除非你刪掉數據庫。可是空間沒有被浪費mongodb
Ps:
1.GridFS
GridFS是一個出色的分佈式文件系統,能夠支持海量的數據存儲。
內置了GridFS了MongoDB,可以知足對大數據集的快速範圍查詢。
2.內置Auto-Sharding 自動分片支持雲集擴展性,分片簡單
提供基於Range的Auto Sharding機制:
一個collection可按照記錄的範圍,分紅若干個段,切分到不一樣的Shard上。
Shards能夠和複製結合,配合Replica sets可以實現Sharding+fail-over,不一樣的Shard之間能夠負載均衡。
查詢是對客戶端是透明的。客戶端執行查詢,統計,MapReduce等操做,這些會被MongoDB自動路由到後端的數據節點。
這讓咱們關注於本身的業務,適當的 時候能夠無痛的升級。MongoDB的Sharding設計能力最大可支持約20 petabytes,足以支撐通常應用。
這能夠保證MongoDB運行在便宜的PC服務器集羣上。PC集羣擴充起來很是方便而且成本很低,避免了「sharding」操做的複雜性和成本。
三、海量數據下,性能優越
在使用場合下,千萬級別的文檔對象,近10G的數據,對有索引的ID的查詢不會比mysql慢,而對非索引字段的查詢,則是全面勝出。 mysql實際沒法勝任大數據量下任意字段的查詢,而mongodb的查詢性能實在讓我驚訝。寫入性能一樣很使人滿意,一樣寫入百萬級別的數 據,mongodb比我之前試用過的couchdb要快得多,基本10分鐘如下能夠解決。補上一句,觀察過程當中mongodb都遠算不上是CPU殺手。
四、全索引支持,擴展到內部對象和內嵌數組
索引一般可以極大的提升查詢的效率,若是沒有索引,MongoDB在讀取數據時必須掃描集合中的每一個文件並選取那些符合查詢條件的記錄。
這種掃描全集合的查詢效率是很是低的,特別在處理大量的數據時,查詢能夠要花費幾十秒甚至幾分鐘,這對網站的性能是很是致命的。
索引是特殊的數據結構,索引存儲在一個易於遍歷讀取的數據集合中,索引是對數據庫表中一列或多列的值進行排序的一種結構。
五、MapReduce 支持複雜聚合
MongoDB中聚合(aggregate)主要用於處理數據(諸如統計平均值,求和等),並返回計算後的數據結果。有點相似sql語句中的 count(*)。
與關係型數據庫相比,mongodb的缺點:
Mongodb 不支持事物操做:
因此事務要求嚴格的系統(若是銀行系統)確定不能用它。
mongodb不支持事務操做:
因此事務要求嚴格的系統(若是銀行系統)確定不能用它。
mongodb佔用空間過大:
關於其緣由,在官方的FAQ中,提到有以下幾個方面:
一、空間的預分配:爲避免造成過多的硬盤碎片,mongodb每次空間不足時都會申請生成一大塊的硬盤空間,並且申請的量從64M、128M、256M那 樣的指數遞增,直到2G爲單個文件的最大致積。隨着數據量的增長,你能夠在其數據目錄裏看到這些整塊生成容量不斷遞增的文件。
二、字段名所佔用的空間:爲了保持每一個記錄內的結構信息用於查詢,mongodb須要把每一個字段的key-value都以BSON的形式存儲,若是 value域相對於key域並不大,好比存放數值型的數據,則數據的overhead是最大的。一種減小空間佔用的方法是把字段名儘可能取短一些,這樣佔用 空間就小了,但這就要求在易讀性與空間佔用上做爲權衡了。
三、刪除記錄不釋放空間:這很容易理解,爲避免記錄刪除後的數據的大規模挪動,原記錄空間不刪除,只標記「已刪除」便可,之後還能夠重複利用。
四、能夠按期運行db.repairDatabase()來整理記錄,但這個過程會比較緩慢
MongoDB沒有如MySQL那樣成熟的維護工具,這對於開發和IT運營都是個值得注意的地方。shell
4、安裝部署數據庫
(一)yum源方式安裝json
一、添加yum源
vim /etc/yum.repos.d/mongodb3.0.repo
[mongodb]
name=mongodb
baseurl=http://mirrors.aliyun.com/mongodb/yum/redhat/7Server/mongodb-org/3.2/x86_64/
http://mirrors.aliyun.com/mongodb/yum/redhat/7Server/mongodb-org/3.7/x86_64/
enabled=1
gpgcheck=0vim
二、安裝
yum -y install mongodb-org後端
三、安裝完的後續調整數組
blockdev --report blockdev --setra 256 /dev/sda blockdev --setra 256 /dev/dm-1
四、WARNING 解決
WARNING: /sys/kernel/mm/transparent_hugepage/enabled?is?'always'.
須要作如下操做
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
打開文件數限制
vim /etc/security/limits.d/20-nproc.conf(不必定是這個名稱,能夠cd到limits.d目錄下查看)
五、 CentOS 7上須要把mongoDB添加到systemd,不然會出現下面的錯誤
systemd[1]: Failed to start SYSV: Mongo is a scalable, document-oriented database..
將mongodb添加到systemd管理中
vim /usr/lib/systemd/system/mongod.service
[Unit]
Description=mongodb database
[Service]
User=mongod
Group=mongod
Environment="OPTIONS=--quiet -f /etc/mongod.conf"
ExecStart=/usr/bin/mongod $OPTIONS run
PIDFile=/var/run/mongodb/mongod.pid
[Install]
WantedBy=multi-user.target
創建軟鏈接
ln -s /usr/lib/systemd/system/mongod.service /etc/systemd/system/multi-user.target.wants/
從新加載systemctl
systemctl daemon-reload
六、寫配置文件
vim mongodb.conf(主上的啓動參數文件)
systemLog:
destination: file
logAppend: true
path: /data/mongodb/logs/mongod.log
storage:
dbPath: /data/db
journal:
enabled: true
processManagement:
net:
port: 27001
security:
authorization: enabled
七、啓動
mkdir -p /data/mongodb/logs/
mongod -f mongodb.conf
(二)源碼方式安裝
一、下載源碼包
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz
二、解壓
tar zxf mongodb-linux-x86_64-3.0.6.tgz -C /data/
cd /data &&mv mongodb-linux-x86_64-3.0.6/ mongodb
三、添加環境變量
echo "export PATH=/data/mongodb/bin/:$PATH" >>/etc/profile
soure /etc/profile
四、建立一個默認數據保存目錄
mkdir -p /data/db
mkdir -p /data/mongodb/logs/
五、添加一個配置文件
vim /etc/mongodb.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/logs/mongod.log
storage:
dbPath: /data/db
journal:
enabled: true
processManagement:
net:
port: 27001
security:
authorization: enabled
六、啓動
mongod -f mongodb.conf
Ps: Warrning 源碼安裝WARNING錯誤是同樣的,請按照yum方式處理WARNING問題
5、操做使用
數據庫經常使用命令
一、Help查看命令提示
help
db.help();
db.yourColl.help();
db.youColl.find().help();
rs.help();
二、切換/建立數據庫
use yourDB; 當建立一個集合(table)的時候會自動建立當前數據庫
三、查詢全部數據庫
show dbs;
四、刪除當前使用數據庫
db.dropDatabase();
五、從指定主機上克隆數據庫
db.cloneDatabase(「127.0.0.1」); 將指定機器上的數據庫的數據克隆到當前數據庫
六、從指定的機器上覆制指定數據庫數據到某個數據庫
db.copyDatabase("mydb", "temp", "127.0.0.1");將本機的mydb的數據複製到temp數據庫中
七、修復當前數據庫
db.repairDatabase();
八、查看當前使用的數據庫
db.getName();
db; db和getName方法是同樣的效果,均可以查詢當前使用的數據庫
九、顯示當前db狀態
db.stats();
十、當前db版本
db.version();
十一、查看當前db的連接機器地址
db.getMongo();
Collection彙集集合
一、建立一個彙集集合(table)
db.createCollection(「collName」, {size: 20, capped: 5, max: 100});
二、獲得指定名稱的彙集集合(table)
db.getCollection("account");
三、獲得當前db的全部彙集集合
db.getCollectionNames();
四、顯示當前db全部彙集索引的狀態
db.printCollectionStats();
用戶相關
一、添加一個用戶
db.addUser("name");
db.addUser("userName", "pwd123", true); 添加用戶、設置密碼、是否只讀
二、數據庫認證、安全模式
db.auth("userName", "123123");
三、顯示當前全部用戶
show users;
四、刪除用戶
db.removeUser("userName");
其餘
一、查詢以前的錯誤信息
db.getPrevError();
二、清除錯誤記錄
db.resetError();
查看彙集集合基本信息
一、查看幫助 db.yourColl.help();
二、查詢當前集合的數據條數 db.yourColl.count();
三、查看數據空間大小 db.userInfo.dataSize();
四、獲得當前彙集集合所在的db db.userInfo.getDB();
五、獲得當前彙集的狀態 db.userInfo.stats();
六、獲得彙集集合總大小 db.userInfo.totalSize();
七、彙集集合儲存空間大小 db.userInfo.storageSize();
八、Shard版本信息 db.userInfo.getShardVersion()
九、彙集集合重命名 db.userInfo.renameCollection("users"); 將userInfo重命名爲users
十、刪除當前彙集集合 db.userInfo.drop();
彙集集合查詢
一、查詢全部記錄
db.userInfo.find();
至關於:select* from userInfo;
默認每頁顯示20條記錄,當顯示不下的狀況下,能夠用it迭代命令查詢下一頁數據。注意:鍵入it命令不能帶「;」
可是你能夠設置每頁顯示數據的大小,用DBQuery.shellBatchSize= 50;這樣每頁就顯示50條記錄了。
二、查詢去掉後的當前彙集集合中的某列的重複數據
db.userInfo.distinct("name");
會過濾掉name中的相同數據
至關於:select distict name from userInfo;
三、查詢age = 22的記錄
db.userInfo.find({"age": 22});
至關於: select * from userInfo where age = 22;
四、查詢age > 22的記錄
db.userInfo.find({age: {$gt: 22}});
至關於:select * from userInfo where age >22;
五、查詢age < 22的記錄
db.userInfo.find({age: {$lt: 22}});
至關於:select * from userInfo where age <22;
六、查詢age >= 25的記錄
db.userInfo.find({age: {$gte: 25}});
至關於:select * from userInfo where age >= 25;
七、查詢age <= 25的記錄
db.userInfo.find({age: {$lte: 25}});
八、查詢age >= 23 而且 age <= 26
db.userInfo.find({age: {$gte: 23, $lte: 26}});
九、查詢name中包含 mongo的數據
db.userInfo.find({name: /mongo/});
//至關於%%
select * from userInfo where name like ‘%mongo%’;
十、查詢name中以mongo開頭的
db.userInfo.find({name: /^mongo/});
select * from userInfo where name like ‘mongo%’;
十一、查詢指定列name、age數據
db.userInfo.find({}, {name: 1, age: 1});
至關於:select name, age from userInfo;
固然name也能夠用true或false,當用ture的狀況下河name:1效果同樣,若是用false就是排除name,顯示name之外的列信息。
十二、查詢指定列name、age數據, age > 25
db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1});
至關於:select name, age from userInfo where age >25;
1三、按照年齡排序
升序:db.userInfo.find().sort({age: 1});
降序:db.userInfo.find().sort({age: -1});
1四、查詢name = zhangsan, age = 22的數據
db.userInfo.find({name: 'zhangsan', age: 22});
至關於:select * from userInfo where name = ‘zhangsan’ and age = ‘22’;
1五、查詢前5條數據
db.userInfo.find().limit(5);
至關於:selecttop 5 * from userInfo;
1六、查詢10條之後的數據
db.userInfo.find().skip(10);
至關於:select from userInfo where id not in (
selecttop 10 from userInfo
);
1七、查詢在5-10之間的數據
db.userInfo.find().limit(10).skip(5);
可用於分頁,limit是pageSize,skip是第幾頁*pageSize
1八、or與 查詢
db.userInfo.find({$or: [{age: 22}, {age: 25}]});
至關於:select * from userInfo where age = 22 or age = 25;
1九、查詢第一條數據
db.userInfo.findOne();
至關於:selecttop 1 * from userInfo;
db.userInfo.find().limit(1);
20、查詢某個結果集的記錄條數
db.userInfo.find({age: {$gte: 25}}).count();
至關於:select count(*) from userInfo where age >= 20;
2一、按照某列進行排序
db.userInfo.find({sex: {$exists: true}}).count();
至關於:select count(sex) from userInfo;
索引
一、建立索引
db.userInfo.ensureIndex({name: 1});
db.userInfo.ensureIndex({name: 1, ts: -1});
二、查詢當前彙集集合全部索引
db.userInfo.getIndexes();
三、查看總索引記錄大小
db.userInfo.totalIndexSize();
四、讀取當前集合的全部index信息
db.users.reIndex();
五、刪除指定索引
db.users.dropIndex("name_1");
六、刪除全部索引索引
db.users.dropIndexes();
修改、添加、刪除集合數據
一、添加
db.users.save({name: ‘zhangsan’, age: 25, sex: true});
添加的數據的數據列,沒有固定,根據添加的數據爲準
二、修改
db.users.update({age: 25}, {$set: {name: 'changeName'}}, false, true);
至關於:update users set name = ‘changeName’ where age = 25;
db.users.update({name: 'Lisi'}, {$inc: {age: 50}}, false, true);
至關於:update users set age = age + 50 where name = ‘Lisi’;
db.users.update({name: 'Lisi'}, {$inc: {age: 50}, $set: {name: 'hoho'}}, false, true);
至關於:update users set age = age + 50, name = ‘hoho’ where name = ‘Lisi’;
三、刪除
db.users.remove({age: 132});
四、查詢修改刪除
db.users.findAndModify({
query: {age: {$gte: 25}},
sort: {age: -1},
update: {$set: {name: 'a2'}, $inc: {age: 2}},
remove: true
});
db.runCommand({ findandmodify : "users", query: {age: {$gte: 25}}, sort: {age: -1}, update: {$set: {name: 'a2'}, $inc: {age: 2}},remove: true});update 或 remove 其中一個是必須的參數; 其餘參數可選。