mongodb

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

NoSQL

NoSQL不使用SQL作爲查詢語言。其數據的儲存可以不需要固定的表格形式。也會經常的被使用sql的join

特點

通常提供弱的一致性保護, 但保證最終的一致性。

關係型數據庫遵守的特點

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

分佈式系統

分佈式系統是由多臺計算機和通信軟件組成,通過網絡相互連接。分佈式系統是建立在網絡之上的系統。分佈式系統的區別在於操作系統。

分佈式系統的優點

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

缺點

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

RDBMS 和 NoSQL

RDBMS

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

NoSQL

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

CAP定理

CAP定理被稱爲布魯爾定理,對於分佈式系統來說,不可能滿足以下三點
一致性 (等同於所有節點訪問同一份最新數據的副本)
可用性 (每次請求都能獲取到非錯誤的響應)
分區容錯性(系統中任意錯誤都不會導致錯誤的丟失)
更多 https://ja.wikipedia.org/wiki...
根據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/h...
http://digital.vpr.net
https://foursquare.com/

MongoDB

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

 特點

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

歷史

2007年來的

MongDB下載,安裝

訪問官網下載 https://www.mongodb.com/downl...
其中文社區 http://www.mongoing.com/
一個可視化工具 https://www.nosqlclient.com/
或者 http://mms.litixsoft.de/index...

因爲某些緣故,導致燈塔國的東東很慢很慢
一直感覺安裝的。。。很炫酷。。
沒辦法。。。燈塔國的。。好吧,安裝完畢

設置數據目錄

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 FilesMongoDBServer4.0bin

打開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設置爲主鍵

一張圖說明
<img src="https://www.iming.info/images...;>

數據庫

一個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;

博客

www.iming.info

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章