MongoDB芒果數據庫php
數據存儲階段python
文件管理階段(.txt .doc .xlc)mysql
優勢:數據能夠長期保存;數據有必定格式化規範;能夠大量存儲;使用簡單方便c++
缺點:數據一致性差;用戶查找修改不方便;數據冗餘正則表達式
數據庫管理階段sql
優勢:數據組織結構化,下降了冗餘;提升了增刪改查的效率;便於擴展,方便程序調試作自動化處理mongodb
缺點:數據庫的使用專業性較強,相對比較複雜shell
幾個概念數據庫
數據:可以輸入到計算機中並被識別處理的信息的集合編程
數據結構:研究組成數據集合中數據之間關係的學科
數據庫:按照數據結構,存儲管理數據的倉庫。是在數據管理系統軟件軟件管理和控制下建立在必定介質上的數據集合
數據管理系統:數據管理軟件,用於維護管理數據庫
數據庫系統:用數據庫,數據庫管理系統,開發工具等組成的工具
關係型數據庫(Oracle、DB二、SQLServer、Mysql、sqlite)
採用關係模型來組織數據結構的數據庫(二維表)
優勢:容易理解,邏輯相似常見的表格;使用方便,都是用sql語句,sql語句很是成熟;數據一致性高,冗餘低,完整度號;技術成熟,可使用外部連接等複雜操做
缺點:每次操做都須要SQL語句解析,消耗較大;不能很好的知足併發需求,應對海量數據爆發力不從心;關係型數據庫內存存在大量的加鎖操做,讀寫能力受到限制;數據不夠靈活,有時會致使結構複雜化
非關係型數據庫 (NoSql --》 not only sql)
優勢:高併發,讀寫能力強、擴展性強、使用靈活、弱化了數據結構、下降數據一致性
缺點:通用性差,並無sql那樣統一的操做語句;操做靈活,容易混亂;沒有join等複雜操做,版本更新快
Noaql的使用狀況
一、數據的一致性要求低
二、處理數據的海量併發
三、數據庫大小不容易肯定。須要分佈擴展
四、給定的數據結構構創建非關係模型更加容易
Nosql分類:
鍵值數據庫 Redis
列存儲數據庫
文檔數據庫 MongoDB
圖形數據庫
MongoDB數據庫(非關係型數據庫------》 文檔型數據庫)
一、由c++編寫的數據庫管理系統
二、支持豐富的增刪改查功能
三、支持豐富的數據類型
四、支持衆多的編程語言結構(python php c++ js C#)
五、在NoSql中技術相對比較成熟
sudo apt-get install mongodb
默認安裝路徑:/var/lib/mongodb
配置文件:/etc/mongodb.conf
命令集:/usr/bin /usr/local/bin
whereis 軟件名:查看一個軟件的位置
一、下載合適版本的mongodb
www.mongodb.com ---> get Mongodb --> community server
2. 選擇合適的位置解壓 (/usr/local /opt)
解壓後獲得mongodb文件夾
3. 將文件夾下bin文件夾加入到環境變量
(bin中就是命令集)
PATH=$PATH:/opt/mongodb.../bin
export PATH
將以上兩句寫入 /etc/rc.local
4. 重啓系統
mongo --dbpath 目錄 設置數據庫的存儲位置 e.g. mongdb --dbpath dbs
mongo --port 8080 設置數據庫的端口,默認是27017
mongo 進入mongo shell,mongodb的交互模式,用於操做mongodb數據庫,
quit()或者ctrl+c 退出mongo shell
組織結構:鍵值對----》文檔-----》集合-----》數據庫
--------------------------------------
ID | name | age
---------------------------------------
1 | Lily | 17
---------------------------------------
2 | Lucy | 18
---------------------------------------
{
"_id":1,
"name":"Lily",
"age":17
},
{
"_id":2,
"name":"Lucy",
"age":18
}
概念對比
mysql 和 mongodb概念比較
mysql mongdb 含義
database database 數據庫
table collection 表/集合
column field 字段/域
row document 記錄/文檔
index index 索引
ues databaseName 建立數據庫 e.g. use stu 建立一個叫stu的數據庫
* 實際ues是選擇使用哪一個數據庫。當選擇的數據庫不存在是就會自動建立
* 只有向數據庫中插入數據時數據庫纔會被真實建立出來,而use後不會立刻建立
show dbs 查看數據庫
系統數據庫
admin:存放用戶的權限
local:存放本地化數據
config:存放分片信息
數據庫的命名規則
一、使用utf-8字符
二、不能含有空格 . / \ '0'字符
三、長度不能超過64字節
四、不能和系統數據庫重名
* 習慣上使用小寫字母,表達數據庫的含義
db:mongo系統全局變量,表明當前正在使用的數據庫
* 當不使用use選擇任何數據庫的時候,db表示test。此時插入數據則建立test數據庫
數據庫的備份和恢復
備份 mongodump -h dbhost -d dbname -o dbdir
e.g. 將127.0.0.1上的stu數據庫備份到bak目錄中
mongodump -h 127.0.0.1 -d syu -o bak
恢復 mongostore -h host:port -d dbname dbpath
e.g. 將stu數據庫恢復到127.0.0.1上的student數據庫中。若是student數據庫不存在則自動建立
mongorestore -h 127.0.0.1:27017 -d student bak/stu
數據庫的檢測命令
mongostat
insert query updata delete:每秒增刪改查的次數
command 每秒運行命令的次數
flushes 每秒和磁盤交互的次數
vsize 使用虛擬內存大小
mongotop 檢測每一個數據讀寫時長
ns total read write
數據集合 總時長 讀時長 寫時長
db.dropDatabase() 刪除db所表明的數據庫
db.createCollection(collection_name) 建立集合,e.g. 建立一個叫class1的集合,db.createCollection('class1')
* 當向這個數據插入數據的時候哦,若是這個集合不存在則自動建立
db.collection.insert(...) e.g.若是class2不存在則建立這個集合並插入數 db,class2.insert({"name":"Lucy","age":18})
show tables 查看集合
show collections 查看集合
集合的命名規則:
一、合法的utf-8字符串
二、不能有'\0'
三、不能以system開頭。是系統的保留前綴
四、不能和關鍵字重複
db.collection.drop() 刪除集合 e.g. 刪除class2集合 db.class2.drop()
db.collection.renameCollection("new_name") 集合重命名
e.g.將class重命名爲class0 db.class.renameCollection("class0")
mongdb中數據的組織形式---》文檔
mongodb文檔:以鍵值對的形式組成的相似於字典的數據結構結合。是對數據的一種描述
鍵:即文檔的域
命名規則
1. utf-8 格式字串
2. 不能有'\0'
3. 一個文檔中的鍵不能重複
* 文檔中鍵值對是有序的,mongodb嚴格區分大小寫
值:即文檔存儲數據,也就是mongodb支持的數據類型
bson ---> json ----> JavaScript
值類型 數值
整型 整數 1 2 3 -1 -3
布爾類型 true false
浮點型 小數 1.234
Array 數組 [1,2,3]
Timestamp 時間戳
Date 時間日期
Object 內部文檔
Null 空值 null
String 字符串
Symbol 特殊字符串
Binary data 二進制字符串
code 代碼
regex 正則表達式
ObjectId ObjectId對象
ObjectId
"_id" : ObjectId("5b764646d4ff0ad8f415f977")
_id : 若是在插入文檔時沒有指定_id域,則系統會自動添加該域做爲主鍵。值則是一個ObjectId類型數據
24 位 16進制數 --》 保證全部的_id值的惟一性
8位的 文檔建立時間 6位 機器ID 4位 進程id 6位計數器
集合中的文檔
* 集合中的文檔不必定域的個數相同
* 集合中的文檔不必定有相同的域
(關係型數據庫: 表決定字段,mongodb中 文檔決定域
集合設計原則
1. 集合中的文檔應該儘量描述同一類內容。有更多相同的域
2. 同一類數據信息,不要過多分散集合存放
3. 集合中文檔的層次不要包含太多
插入文檔
db.collection.insert()
插入單個文檔
e.g.
db.class0.insert({'name':"Lucy","age":18})
db.class0.insert({name:"Tom",age:17,sex:'m'})
* 查看插入結果 : db.class0.find()
* 文檔中鍵能夠不加引號
* _id爲系統自動添加主鍵,若是本身寫也能夠,可是不能重複
插入多條文檔
db.collection.insert([{},{},{}])
e.g.
db.class1.insert([{name:'阿寶',age:33,sex:'m'},{name:'阿蓉',age:27,sex:'w'},{name:'阿哲',age:32,sex:'m'}])
save 插入文檔
db.collection.save()
e.g.
db.class0.save({name:'Davil',age:16,sex:'m'})
db.class1.save([{name:'小白',age:30,sex:'w'},{name:'小陳',age:34,sex:'m'}])
* 若是不適用_id則save用法同insert同樣
* 若是加_id項,此時文檔已經存在時則會替換原有文檔