mongodb

MongDB
MongDB一種面向文檔的數據庫管理系統,由C++寫成。
官網 https://www.mongodb.com/
github https://github.com/mongodb/mongophp

NoSQL

NoSQL不使用SQL做爲查詢語言。其數據的儲存能夠不須要固定的表格形式。也會常常的被使用sql的joinhtml

特色

一般提供弱的一致性保護, 但保證最終的一致性。mysql

關係型數據庫遵照的特色

ACID
即 A 原子性 事物中的操做要麼全作,要麼都作
C 一致性 數據庫一直要處於一致的狀態
I 獨立性 併發事物之間不會相互影響(即 三級封鎖協議,鎖的造成)
D 持久性 數據庫提交完成之後持久保存git

分佈式系統

分佈式系統是由多臺計算機和通訊軟件組成,經過網絡相互鏈接。分佈式系統是創建在網絡之上的系統。分佈式系統的區別在於操做系統。github

分佈式系統的優勢

可靠性(容錯機制)可擴展性(能夠隨意的增長更多的機器)資源共享(數據之間能夠共享)靈活性(因爲該系統是很是靈活的,易於安裝)更快的速度(分佈式計算擁有更快的計算能力,易於進行更多的計算)開放系統(因爲其系統是開放,本地和遠程均可直接訪問)更高的性能(相比於集羣,擁有更高的性能)web

缺點

故障不易排除,擁有更少的軟件,網絡問題,安全性問題sql

RDBMS 和 NoSQL

RDBMS

爲關係型數據庫的基礎
擁有高度的組織化結構數據
擁有結構化查詢語言
數據和關係都儲存在單獨的表中
嚴格的一致性
基礎的事物mongodb

NoSQL

沒有聲明式查詢語言
沒有預約義模式
鍵值對儲存,列儲存,文檔儲存,圖形數據庫
最終的一致性而不保證過程的一致性
非結構化和不可預知的數據
CAP定理
高性能,高可用性和高伸縮性shell

CAP定理

CAP定理被稱爲布魯爾定理,對於分佈式系統來講,不可能知足如下三點
一致性 (等同於全部節點訪問同一份最新數據的副本)
可用性 (每次請求都能獲取到非錯誤的響應)
分區容錯性(系統中任意錯誤都不會致使錯誤的丟失)
更多 https://ja.wikipedia.org/wiki/CAP%E5%AE%9A%E7%90%86
根據CAP原理 將數據庫分類以下 知足 CA 原則、知足 CP 原則和知足 AP 原則的三大類數據庫

BASE

BASE:Basically Available, Soft-state, Eventually Consistent。
BASE是NoSQL數據庫一般對可用性及一致性的弱要求原則

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/

MongoDB

由C++編寫,MongoDB將數據儲存爲一個文檔
數據結構由鍵值對組成。其文檔相似於JSON對象

 特色

豐富的表達式,支持任何索引,負載的增長,批量處理和聚合操做等等。。。。

歷史

2007年來的

MongDB下載,安裝

訪問官網下載 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

打開Powershell

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的語言終於能夠再次用上

mongodb概念解析

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

注意:

  1. 文檔中的鍵值對有序
  2. 文檔中的值,不只僅是能夠是字符串,也能夠是整個嵌入的文檔
  3. MongoDB類型區分大小寫
  4. mongodb不能有重複鍵
  5. 文檔的鍵是字符串
  6. 鍵不能含有\0 由於\0表明着結束
  7. $有特定含義,不能隨便使用
  8. _開頭的鍵是保留的

集合

集合即表格,即表
集合存在於數據庫中,集合沒有固定的結構。
這意味着能夠往集合裏插入任何的格式。
一般狀況下,插入的數據具備關聯性
例如能夠將

{"site":"www.google.com"}

數據插入集合中,該文檔就會被建立

合法的集合名

集合名不能是空字符串
集合名不能含有\0
集合名不能以system開頭
建立的集合名不能有保留字,由於系統生成的集合包含有$

元數據

數據庫的信息存儲在集合中,使用了系統命名的空間

mongodb數據類型

Objectid

惟一主鍵包含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 分別插入一行或者多行

MongoDB更新文檔

使用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" }
>

and條件

> 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條件

使用$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;
相關文章
相關標籤/搜索