MongDB
MongDB一種面向文檔的數據庫管理系統,由C++寫成。
官網 https://www.mongodb.com/
github https://github.com/mongodb/mongophp
NoSQL不使用SQL做爲查詢語言。其數據的儲存能夠不須要固定的表格形式。也會常常的被使用sql的joinhtml
一般提供弱的一致性保護, 但保證最終的一致性。mysql
ACID
即 A 原子性 事物中的操做要麼全作,要麼都作
C 一致性 數據庫一直要處於一致的狀態
I 獨立性 併發事物之間不會相互影響(即 三級封鎖協議,鎖的造成)
D 持久性 數據庫提交完成之後持久保存git
分佈式系統是由多臺計算機和通訊軟件組成,經過網絡相互鏈接。分佈式系統是創建在網絡之上的系統。分佈式系統的區別在於操做系統。github
可靠性(容錯機制)可擴展性(能夠隨意的增長更多的機器)資源共享(數據之間能夠共享)靈活性(因爲該系統是很是靈活的,易於安裝)更快的速度(分佈式計算擁有更快的計算能力,易於進行更多的計算)開放系統(因爲其系統是開放,本地和遠程均可直接訪問)更高的性能(相比於集羣,擁有更高的性能)web
故障不易排除,擁有更少的軟件,網絡問題,安全性問題sql
爲關係型數據庫的基礎
擁有高度的組織化結構數據
擁有結構化查詢語言
數據和關係都儲存在單獨的表中
嚴格的一致性
基礎的事物mongodb
沒有聲明式查詢語言
沒有預約義模式
鍵值對儲存,列儲存,文檔儲存,圖形數據庫
最終的一致性而不保證過程的一致性
非結構化和不可預知的數據
CAP定理
高性能,高可用性和高伸縮性shell
CAP定理被稱爲布魯爾定理,對於分佈式系統來講,不可能知足如下三點
一致性 (等同於全部節點訪問同一份最新數據的副本)
可用性 (每次請求都能獲取到非錯誤的響應)
分區容錯性(系統中任意錯誤都不會致使錯誤的丟失)
更多 https://ja.wikipedia.org/wiki/CAP%E5%AE%9A%E7%90%86
根據CAP原理 將數據庫分類以下 知足 CA 原則、知足 CP 原則和知足 AP 原則的三大類數據庫
BASE:Basically Available, Soft-state, Eventually Consistent。
BASE是NoSQL數據庫一般對可用性及一致性的弱要求原則
列儲存 | 按照列儲存數據 | 表明
--------|--------------| Hbase
文檔儲存 | 相似於JSON的格式,儲存的內容是文檔類型的,這樣有機會對某些字段創建索引,實現關係數據庫的某些功能。| Mongdb
key-value 儲存 | 經過key快速查詢到value | Redis
圖儲存 | 圖形儲存 | Flockdb 來自於推特
對象儲存 | 經過面向對象的語法來操做數據庫 | Versant
xml數據 | 儲存XML數據 | http://basex.org/
Google((*^__^*) 嘻嘻……)
http://digg.com/
https://www.mheducation.com/home.html
http://digital.vpr.net
https://foursquare.com/
由C++編寫,MongoDB將數據儲存爲一個文檔
數據結構由鍵值對組成。其文檔相似於JSON對象
豐富的表達式,支持任何索引,負載的增長,批量處理和聚合操做等等。。。。
2007年來的
訪問官網下載 https://www.mongodb.com/download-center#community
其中文社區 http://www.mongoing.com/
一個可視化工具 https://www.nosqlclient.com/
或者 http://mms.litixsoft.de/index.php?lang=en
由於某些緣故,致使燈塔國的東東很慢很慢
一直感受安裝的。。。很炫酷。。
沒辦法。。。燈塔國的。。好吧,安裝完畢
PS C:\> cd data PS C:\data> ls PS C:\data> mkdir db 目錄: C:\data Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2018/7/31 2:37 db PS C:\data> ls 目錄: C:\data Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2018/7/31 2:37 db PS C:\data> cd db PS C:\data\db>
C:\Program Files\MongoDB\Server\4.0\bin
PS C:\Program Files\MongoDB\Server\4.0\bin> mongod -dbpath c:\data\db
執行mongod建立數據目錄
PS C:\Users\mingm\Desktop> mongo.exe MongoDB shell version v4.0.0 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 4.0.0 Server has startup warnings: 2018-07-31T02:32:28.615+0800 I CONTROL [initandlisten] 2018-07-31T02:32:28.616+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. 2018-07-31T02:32:28.616+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. 2018-07-31T02:32:28.616+0800 I CONTROL [initandlisten] --- Enable MongoDB's free cloud-based monitoring service to collect and display metrics about your deployment (disk utilization, CPU, operation statistics, etc). The monitoring data will be available on a MongoDB website with a unique URL created for you. Anyone you share the URL with will also be able to view this page. MongoDB may use this information to make product improvements and to suggest MongoDB products and deployment options to you. To enable free monitoring, run the following command: db.enableFreeMonitoring() --- >
mongodb://127.0.0.1:27017
將其複製上去就好了
ok好啦,至此安裝完成
這是一個JavaScript shell
(^o^)/ 瞬間擁有親切感。
js的語言終於能夠再次用上
sql | mongodb | 解釋/說明 |
---|---|---|
databass | databass | 數據庫 |
table | collection | 數據庫表/集合 |
row | document | 行/文檔 |
colunm | field | 字段/域 |
index | index | 索引 |
table joins | 錶鏈接 | |
primary key | primary key | 主鍵/nongodb自動將_id設置爲主鍵 |
一張圖說明
一個mongodb能夠創建多個數據庫
> show dbs; admin 0.000GB config 0.000GB local 0.000GB >
使用db顯示當前數據庫的對象和集合
> db test >
相似於關係型數據庫中的表
使用use命令鏈接到一個指定的數據庫
震驚了。。。居然和mysql一個樣子
> use local switched to db local > db local >
文檔是一組鍵值對的集合,
一些屬於和關係型數據庫的對比
關係型數據庫 | 非關係型數據庫
-------------|---------------
數據庫 | 數據庫
表格 | 集合
行 | 文檔
列 | 字段
錶鏈接 | 嵌入文檔
主鍵 | 主鍵 mongodb提供key爲_id
注意:
集合即表格,即表
集合存在於數據庫中,集合沒有固定的結構。
這意味着能夠往集合裏插入任何的格式。
一般狀況下,插入的數據具備關聯性
例如能夠將
{"site":"www.google.com"}
數據插入集合中,該文檔就會被建立
集合名不能是空字符串
集合名不能含有\0
集合名不能以system開頭
建立的集合名不能有保留字,由於系統生成的集合包含有$
數據庫的信息存儲在集合中,使用了系統命名的空間
惟一主鍵包含12位。
前 4 個字節表示建立 unix 時間戳,格林尼治時間 UTC 時間,比北京時間晚了 8 個小時 接下來的 3 個字節是機器標識碼 緊接的兩個字節由進程 id 組成 PID 最後三個字節是隨機數
相似於這樣的
5b5f65cc12df191848c2c72f
字符串爲utf-8編碼
前32位是一個 time_t 值(與Unix新紀元相差的秒數) 後32位是在某秒中操做的一個遞增的序數
格林尼治時間
> var mydate1 = new Date() > mydatel ISODate("2018-07-30T19:26:17.080Z") >
> Date() Tue Jul 31 2018 03:27:07 GMT+0800 >
mongodb:
> use Date switched to db Date > db Date >
查看全部數據庫
> show dbs admin 0.000GB config 0.000GB local 0.000GB >
因爲不存在,須要顯示,向其插入數據
> db.Date.insert({"name":"ming"}); WriteResult({ "nInserted" : 1 }) > show dbs; Date 0.000GB admin 0.000GB config 0.000GB local 0.000GB >
> show dbs; Date 0.000GB admin 0.000GB config 0.000GB local 0.000GB > use Date switched to db Date > db.dropDatabase() { "dropped" : "Date", "ok" : 1 } >
> show dbs admin 0.000GB config 0.000GB local 0.000GB >
> show dbs; admin 0.000GB config 0.000GB local 0.000GB > use local switched to db local > show tabls; 2018-07-31T03:34:06.601+0800 E QUERY [js] Error: don't know how to show [tabls] : shellHelper.show@src/mongo/shell/utils.js:1043:11 shellHelper@src/mongo/shell/utils.js:755:15 @(shellhelp2):1:1 > show tables; mycoll startup_log > db.mycoll.drop(); true > show tables; startup_log >
> show dbs; admin 0.000GB config 0.000GB local 0.000GB > use local switched to db local > db.createCollection("ming"); { "ok" : 1 } > show collections; ming startup_log >
在MongoDB中,不須要建立集合,在插入一些文檔的時候,會自動建立集合
> db.mycol2.insert({"name":"ming"}); WriteResult({ "nInserted" : 1 }) > show collections; ming mycol2 startup_log
> show dbs admin 0.000GB config 0.000GB local 0.000GB > use local switched to db local > show collections; ming mycol2 startup_log > db.mycol2.drop(); true > show collections; ming startup_log >
即插入row
全部的儲存格式是一種JSON格式的
> db.col.insert({title:"ming", ... ming:"sdfdf"}); WriteResult({ "nInserted" : 1 }) > db.col.find(); { "_id" : ObjectId("5b5f6a0ed595bb04cbe14b94"), "title" : "ming", "ming" : "sdfdf" } >
也能夠將數據定義爲一種變量
都是js的語法。不難,很好上手的
還有一個方法是 insertOne 以及insertMany 分別插入一行或者多行
使用update()的方法進行更新
> db.col.insert({title:"ming",ming:"ming"}); WriteResult({ "nInserted" : 1 }) > db.col.find(); { "_id" : ObjectId("5b5f6a0ed595bb04cbe14b94"), "title" : "ming", "ming" : "sdfdf" } { "_id" : ObjectId("5b5f6b27d595bb04cbe14b95"), "title" : "ming", "ming" : "ming" } > db.col.update({title:ming, ming:"ming"},{$set:{"title":"ming",ming:"sferfer"}}); 2018-07-31T03:49:28.376+0800 E QUERY [js] ReferenceError: ming is not defined : @(shell):1:16 > db.col.update({title:"ming"},{$set:{"title":"seferf"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.col.find(); { "_id" : ObjectId("5b5f6a0ed595bb04cbe14b94"), "title" : "seferf", "ming" : "sdfdf" } { "_id" : ObjectId("5b5f6b27d595bb04cbe14b95"), "title" : "ming", "ming" : "ming" } > db.col.find().pretty(); { "_id" : ObjectId("5b5f6a0ed595bb04cbe14b94"), "title" : "seferf", "ming" : "sdfdf" } { "_id" : ObjectId("5b5f6b27d595bb04cbe14b95"), "title" : "ming", "ming" : "ming" } >
使用save()替換其方法
> db.col.find().pretty(); { "_id" : ObjectId("5b5f6a0ed595bb04cbe14b94"), "title" : "seferf", "ming" : "sdfdf" } { "_id" : ObjectId("5b5f6b27d595bb04cbe14b95"), "title" : "ming", "ming" : "ming" } > db.col.save({_id: ObjectId("5b5f6a0ed595bb04cbe14b94"), title:"1111"}); WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.col.find().pretty(); { "_id" : ObjectId("5b5f6a0ed595bb04cbe14b94"), "title" : "1111" } { "_id" : ObjectId("5b5f6b27d595bb04cbe14b95"), "title" : "ming", "ming" : "ming" } >
一樣的updateOne()和updateMany()一樣能夠更新一個或者多個文檔
更新的標識仍然是$set
刪除所有文檔deleteMany(),刪除一個文檔deleteOne()
> db.col.find().pretty(); { "_id" : ObjectId("5b5f6a0ed595bb04cbe14b94"), "title" : "1111" } { "_id" : ObjectId("5b5f6b27d595bb04cbe14b95"), "title" : "ming", "ming" : "ming" } > db.col.deleteOne({title:"ming"}); { "acknowledged" : true, "deletedCount" : 1 } > db.col.find().pretty(); { "_id" : ObjectId("5b5f6a0ed595bb04cbe14b94"), "title" : "1111" } >
> show collections; col ming startup_log > db.ming.find().pretty(); > db.ming.insert(ming:"sfrgedrg"); 2018-07-31T04:01:45.661+0800 E QUERY [js] SyntaxError: missing ) after argument list @(shell):1:19 > db.ming.insert({ming:"sdfrf"}); WriteResult({ "nInserted" : 1 }) > db.ming.find().pretty(); { "_id" : ObjectId("5b5f6eb7d595bb04cbe14b96"), "ming" : "sdfrf" } >
> db.ming.find().pretty(); { "_id" : ObjectId("5b5f6eb7d595bb04cbe14b96"), "ming" : "sdfrf" } { "_id" : ObjectId("5b5f6f0ad595bb04cbe14b97"), "name" : "refgerfg" } { "_id" : ObjectId("5b5f6f40d595bb04cbe14b98"), "x" : 222, "y" : 44444 } { "_id" : ObjectId("5b5f6f50d595bb04cbe14b99"), "x" : 4444, "y" : 22222 } > db.ming.find({x:222, y:4444}); > db.ming.find({x:222, y:4444}).pretty(); > db.ming.find({x:222, y:44444}).pretty(); { "_id" : ObjectId("5b5f6f40d595bb04cbe14b98"), "x" : 222, "y" : 44444 } >
直接,便可
使用$or便可
> db.ming.find({ $or:[{x:222}, {x:4444}] }); { "_id" : ObjectId("5b5f6f40d595bb04cbe14b98"), "x" : 222, "y" : 44444 } { "_id" : ObjectId("5b5f6f50d595bb04cbe14b99"), "x" : 4444, "y" : 22222 } >
sql示例
where likes>50 AND (by = 'ming' OR title = 'ming')
db.ming.find(like: {$gt:50}, $or[{by:"ming"}, {title:"ming"}]);
> $gt < $lt >= $gte <= $lte
db.col.find({like: {$gt: 100}});
類比sql
select * from db.col where like > 100;