優勢:能夠長期保存 能存儲大量數據java
缺點:沒有結構化的組織 查找不方便 數據容易冗餘python
有文件存儲的優勢,同時解決了文件存儲的問題mysql
缺點 : 操做難度較高linux
數據 --> 數據庫 --> 數據庫管理系統 --> 數據庫系統c++
採用關係磨性來組織數據結構的數據庫正則表達式
常見數據庫形式有:Oracle DB2 SQLServer Mysql sqliteredis
優勢:sql
(1)容易理解,使用方便,sql語句自己比較成熟,而關係型數據庫大都採用sql作數據操做mongodb
(2)易於維護,完整性好,數據一致性高shell
(3)通用化程度高,技術成熟,可使用外鏈等操做
缺點:
(1)沒法很好知足高併發需求,每次數據操做都須要解析sql語句,致使讀寫能力降低(通常該類型數據庫都是用C / C++語言編寫的,輸入時採用sql語句,須要編譯)
(3)針對海量數據的爆發處理能力不足,每次操做都要上鎖
(4)擴展性不足
優勢:
(1)能夠知足高併發需求,讀寫能力強
(2)支持分佈式部署
(3)弱化了數據結構,下降了數據的一致性
缺點:
(1)發展比較晚,技術尚不成熟,好比缺乏join等複雜性操做,通用性差,沒有sql這樣的語句
(2)結構靈活,靈活則會致使混亂,寫法複雜
非關係性數據庫(Nosql)適用那些狀況
(1)數據磨性結構簡單
(2)對數據的一致性要求低
(3)對數據的併發處理要求高
(4)對數據的擴展性有要求
非關係型數據庫Nosql分類
(1)鍵值類數據庫:
redis oracle DBD tokyo
如:name:張三
(2)列存儲:
HBase
(3)文檔型數據庫:
MongDB
{ name:張三, sex:男}
(4)圖形數據庫
(1)非關係型 文檔型
(2)C++ 編寫,支持分佈式
(3)數據格式爲bson類型,bson格式是jion的升級版,他豐富了json的數據類型
(4)功能比較前面
(5)支持衆多編程語言接口 python ruby C# C++ PHP
自動安裝
在Linux系統中的安裝步驟
(1)sudo apt -get update
(2)sudo apt -get install mongodb
默認安裝目錄:/var/lib/mongodb
配置文件:
/etc/mongodb.conf
/usr/bin
手動安裝
(1)www.mongodb.com 下載安裝包
(2)在目錄下解壓 /usr/local/opt
(3)解壓後將文件夾中bin目錄添加到環境變量中
export PATH = $PATH:/usr...
在linux終端上輸入mongo能夠啓動mongo shell
tarena@tedu:~$ mongo MongoDB shell version: 2.6.10 connecting to: test
該模式下支持簡單的語法
quit() 退出 mongo shell
mongod
--dbpath:指定數據目錄,每一個mongod進程都須要獨立的數據目錄,若是要是有3哥mongod實例,則必須有3個獨立的數據目錄;當mongod啓動時,會在數據庫目錄中建立mongod.lock文件,這個文件用於防止其餘的mongod純淨使用該數據目錄
--port:指定服務器監聽的端口號,默認端口號爲27017,要運行多個mongo進程,則要給每一個指定不一樣的端口號。
--logpath:指定日誌的輸出路徑,若是對文件夾有讀寫權限,系統會在文件不存在時建立它,它會將已有文件覆蓋掉;
--logappend:同logpath,但該選項可不會將原有文件覆蓋,而是保留原來的日誌
--config:指定配置文件,加載命令行未指定的各類選項
爲了對比,現將關係型數據庫mysql與mongo進行對比
(1)MySQL與mongo基本含義對比
MySQL mongo 含義
database database 數據庫
table collection 表/集合
column field 字段/域
row document 記錄/文檔(每一條信息稱之爲文檔)
index index 索引
(2)數據形式對比
MySQL數據(表)結構形式
---------------------------
id | name | age
---------------------------
1 | Lily | 10
---------------------------
2 | Lucy | 11
---------------------------
mongo數據結構(字典)
{
'_id':ObjectId("xxxxxxxxxxxxxxxxxxx"),
'name': 'Lily',
'age': 10
},
{
'_id':ObjectId("xxxxxxxxxxxxxxxxxxx"),
'name': 'Lucy',
'age': 11
}
建立數據庫:use dbname(dbname爲數據庫名)
注:
(1)use爲選擇使用的數據庫,若是數據庫不存在,則插入數據時會自動建立該數據庫
實例:
tarena@tedu:~$ mongo MongoDB shell version: 2.6.10 connecting to: test > use dbname switched to db dbname > # use 並非直接將數據庫建立起來,主要仍是選擇這個數據,只有真正建立這個表時,纔是真正建立這個數據庫 > show dbs admin (empty) local 0.078GB mongo_test 0.078GB > # 此時並無顯示dbname數據庫,因裏面並無數據
(2)db(全局變量)表示當前正在使用的數據庫,若是沒有use選用目標數據庫,則默認使用一個叫test的數據庫
tarena@tedu:~$ mongo MongoDB shell version: 2.6.10 connecting to: test > db test > use dbname switched to db dbname > db dbname
數據庫的命名規則和特色
(1)數據庫支持格式爲utf-8
(2)數據庫區分大小寫,原則上都是小寫;sql語句則不區分大小寫
(3)命名也能夠是utf-8格式,但不能是空字符串
(4)數據庫名不能含有:空格、點、/ \ '\0'
(5)不能超過64字節
(6)數據庫避免與諸如admin、local、config等數據庫關鍵字衝突
注:admin(存儲用戶權限)、local(存儲不想被分享複製的數據)、config(當分佈式操做時纔會出現,表示分片處理信息)
備份:
mongodump -h dbhost -d dbname -o dbdir
主機 數據庫 文件夾
tarena@tedu:~$ mongodump -h 127.0.0.1 -d stu -o dbstudent connected to: 127.0.0.1 2018-05-08T22:28:06.022+0800 DATABASE: stu to dbstudent/stu
...
查找是否已經備份成功
tarena@tedu:~$ ls AID1709.csv dbstudent PycharmProjects 視頻 下載 anaconda3 examples.desktop 公共的 圖片 音樂 core java_error_in_PYCHARM_.log 模板 文檔 桌面 tarena@tedu:~$ ls dbstudent/ stu
恢復數據
mongorestore -h dbhost -d dbname <path>
主機 將數據回覆到那個數據庫 要恢復數據庫文件夾
tarena@tedu:~$ mongorestore -h 127.0.0.1:27017 -d student student/stu connected to: 127.0.0.1:27017 ...
db.dropDatebase()
功能:刪除當前數據庫
tarena@tedu:~$ mongostat connected to: 127.0.0.1 insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn time *0 *0 *0 *0 0 1|0 0 640m 1.47g 35m 1 test:0.0% 0 0|0 0|0 62b 4k 1 22:40:13 *0 *0 *0 *0 0 1|0 0 640m 1.47g 35m 0 test:0.0% 0 0|0 0|0 62b 4k 1 22:40:14
具體截圖
備註:insert (每秒的插入次數) query(每秒的查詢次數) update(更新次數) delete(刪除次數 )
mongotop 監測數據庫的讀寫時長
tarena@tedu:~$ mongotop connected to: 127.0.0.1 ns total read write 2018-05-08T14:48:20 grid.system.namespaces 0ms 0ms 0ms grid.system.indexes 0ms 0ms 0ms grid.fs.files 0ms 0ms 0ms grid.fs.chunks 0ms 0ms 0ms grade.system.namespaces 0ms 0ms 0ms grade.system.indexes 0ms 0ms 0ms grade.class 0ms 0ms 0ms
截圖顯示
查看方式:show dbs
tarena@tedu:~$ mongo MongoDB shell version: 2.6.10 connecting to: test > show dbs admin (empty) dbname 0.078GB local 0.078GB mongo_test 0.078GB > use stu switched to db stu > db.createCollection('class0') { "ok" : 1 } > db.createCollection('class0') { "ok" : 0, "errmsg" : "collection already exists" }
db.createCollection(collection_name)
功能:建立一個集合
參數:集合的名稱
注:至關於 sql 語句中的表
(1)集合名不能以system . 開頭,它是系統集合保留的前綴
(2)集合名稱不要和關鍵字重名,不要帶有$
(3)集合名能含有 ‘\0'
(4)集合也是utf-8字符串
db.collection_name.insert()
collection_name:集合名
當插入數據時,若是集合不存在則會自動建立;此也意味着,若將集合名稱寫錯時也會建立新的集合並插入數據
tarena@tedu:~$ mongo MongoDB shell version: 2.6.10 connecting to: test > show collections class3 system.indexes > show tables class3 system.indexes >
show collections 和 show tables 能夠達到相同效果
db.createCollection(collection_name)
功能:建立一個集合
參數:集合的名稱
命名規則:
(1)集合也是utf-8 字符串
(2)不能含有'\0',由於最終是用c++來解析的,當存在'\0'時,c++就會默認爲這是結束的
(3)不能以system.開頭,他是系統集合的保留前綴
(4)集合名稱不要和關鍵字重名 ,不要帶有$,mongdb中好多關鍵字是有$引入的,也即,集合名稱不要額操做符重名
db.collection_name.insert()
當插入數據時,集合不存在時則會自動建立
若是將集合名稱寫錯時,也會建立新的集合並插入數據
刪除指定的集合:db.collecton_name.drop()
> show collections abc class0 class1 system.indexes > db.abc.drop() true > show collections class0 class1 system.indexes
db.collection_name.renameCollection(new_name)
參數:新的集合名稱
> show collections class0 class1 system.indexes > db.class1.renameCollection('cls') { "ok" : 1 } > show collections class0 cls system.indexes >
在形式上相似於python中的字典,每一個文檔內部由 0個 或 多個 鍵值對構成,但文檔不一樣於字典的是,文檔是有序的。
bson:{'name':'licy','age':18}
鍵的命名規則:
(1)鍵值均爲uft-8類型字符串,因此做爲鍵時,加不加都可
> db.class0.insert({'name':'李四' ,age:19,}) WriteResult({ "nInserted" : 1 }) > db.class0.find() { "_id" : ObjectId("5abf2fe426803c9f334a1019"), "name" : "李四", "age" : 19 } >
(2)不能有‘\0',通常不會以點.和 $ 開頭,也不使用下劃線_開頭
(3)鍵不能重複
文檔中的值:
指的是mongo數據庫支持的數據類型
mongo支持的數據類型:
字符串 utf-8字符串均爲合法字符串
整型 32位 和64位
布爾類型 true false 或者1 0來表示也能夠
浮點型 小數
Arrays 用來存儲數組胡列表
Timestamp 時間戳,存儲時間節點
Date 時間類型,年月日時分秒
Symbol 字符串類型 一般用來存儲特殊字符
Null null類型 表示空
object 文檔類型(一般用於內部文件)
Binary data 二進制數據
code 代碼 js
regex 正則表達式
ObjectId 系統自動生成的ID對象
在一個集合中文檔的域不必定相同,也就是說鍵值對不必定徹底相同
在一個文檔中儘可能選擇意義相同的文檔放入統一集合中
db.collection.insert()
例如
> db.class0.insert({'name':'李四' ,age:19,}) WriteResult({ "nInserted" : 1 }) > db.class0.find() { "_id" : ObjectId("5abf2fe426803c9f334a1019"), "name" : "李四", "age" : 19 } >
ObjectId("5abf2fe426803c9f334a1019")
_id:是系統自動提供的主鍵,
5abf2fe4 26803c 9f33 4a1019 24位16進制
文檔建立時間 機器ID 進程ID 計數器
插入多條文檔
insert([{},{},{}])
db.class0.insert([{'name':'王五',age:18,sex:'女'},{name:'張三',age:19,sex:'女'}])
insert() 插入數據時,也能夠採用_id 來自定義插入id值,但id值不能重複。
db.collection.save()
實例
db.class0.save({_id:2,name:'婁拉',age:22,sex:'女'})
注:
(1)當插入鍵值對中沒有_id 域時,同insert
(2)當插入鍵值對有_id值,則會將擬插入的_id值與已插入的_id值進行匹配,若是匹配到已經插入的值,則會對相應文檔進行修改,若是沒有匹配到則其功能至關於insert(),將會插入到數據庫中
(3)save() 沒法插入多條數據
db.collection.find(query, field)
功能:查找文檔
參數:
query 查找條件 {name:'張三'}
field 顯示的域 {_id:0}
返回值:返回查找到的文檔(返回第一條,先進先出,查找的第一條,也即先輸入的第一條)
field的值的表示方式:{field:0|1}
0:表示不顯示該域
1:表示顯示該域
注:
(1)若將某個域設置爲1,則表示其餘域均爲0
(2)若將某個域設置爲0,則表示其餘域均爲1
(3)不容許同時設置1和 0
(4)_id 永遠默認爲1,也可將其設置爲0
db.collection.findOne(query, field)
功能:只查找第一條符合查找條件的數據
參數:同find同樣
返回值:返回第一條匹配到的文檔
db.getCollection('class0') == db.class0
= > < >= <= !=
$eq 等於
計算 age=20 的記錄
db.class0.find({age:{$eq:20}},{_id:0})
$lt 小於
$lte 小於等於
$gt 大於
$gte 大於等於
$ne 不等於
例如:
db.class0.find({age:{$gte:19,$lte:21}},{_id:0})
$in 包含
db.class0.find({age:{$in:[17,18,19]}},{_id:0})
$nin 不包含
db.class0.find({age:{$nin:[18,21]}},{_id:0})
and or not
$and 邏輯與
db.class0.find({$and:[{name:'張三'},{age:19}]},{_id:0})
注:query 中逗號分割的多個條件默認就是and關係
$or 邏輯或
db.class0.find({$or:[{age:{$lt:19}},{age:{$gt:21}}]},{_id:0})
$not 邏輯非
db.class0.find({age:{$not:{$gt:20}}},{_id:0})
$nor 既不是也不是
db.class0.find({$nor:[{age:{$gt:20}},{sex:'男'}]},{_id:0})
age > 21 or (namg = 張三 and sex != 女) db.class0.find({$or:[{age:{$gt:21}},{name:'張三',sex:{$not:{$eq:'女'}}}]},{_id:0}) db.class0.find({$or:[{age:{$gt:21}},{name:'張三',sex:{$nin:['女']}}]},{_id:0})