- nosql
memcached緩存數據庫與redies緩存數據庫區別
neo4j圖形數據庫
./mongod --shutdown 關閉進程
-
開啓 mongo 數據庫
mongod --dbpath D:\study\github\nodeKnowledge\study\mongodb\db --port 27018
; -
mongod 關閉.
mongod --shutdown
; -
mongod 配置文件啓動:
logpath=/ldy/mongodb/log/mongodb.log // 日誌文件; logappend=false dbpath=/ldy/mongodb/data/db // 數據文件; fork=true // 後臺,開啓子父進程; rest=true // 是否開啓web控制檯;
- mongodb之shell腳本
- /mongo/bin/mongo:啓動mongo,開啓shell腳本。
- show dbs — 已有數據庫列表
- use dbname 切換並創建數據庫
- db.account.drop() 刪除集合
- db.dropDatabase() 刪除數據庫
- show collections 已有集合列表
- db.account.find() 查詢數據
- db.account.save({條件})存數據
- mongodb之工具
- 數據庫備份:mongodump -h dbhost -d dbname -o dbdirectory
- 查看備份數據庫的數據:bsondump
./bsondump ./dump/ldy/account.bson
- 恢復數據庫:mongorestore -h dbhost -d dbname --dbdirectoryperdb dbdirectory
- 數據導出:mongoexport
./mongoexport -d ldy -c account -q {條件} -f name,add (屬性)--type=csv > account.csv
- 數據導入:mongoimport
./mongoimport -d ldy -c account --type csv --headerline --drop< account.csv
數據庫基本概念
- 文檔,集合:沒有模式的表;
- 文檔:多個鍵值有序存放在一起;單鍵值文檔和多鍵值文檔;區分數據類型,鍵區分大小寫,不允許重複的鍵;
- 集合: 一組文檔,與sql表類似;集合無模式,有開發者把握;
- 集合不能有空字符串;
- 集合命名不能含有保留字符$;
- 數據庫:一個mongod實列可以存放多個數據庫;全部小寫;不能空子符;系統保留數據庫,admin,local;
- local,永遠不會被複制;
- config: 內部使用,保存分片信息;
- 命名空間不能超過121字節;
基礎數據類型
- 支持js正則表達式
- 基本數據類型,new Date();
- 支持js代碼;
- 支持二進制數據(通過代碼寫進取),不支持shell寫入;
- 支持js的引用類型;
- 內嵌文檔;
- bson 二進制,節省空間,支持數據類型比json更多。
- objectId格式:
- 12字節
- 4位時間戳+3位機器號+2位pid(進程號)+3位計數器
- 3位計數器共2^24個數;
mongodb增刪改
- 插入
- 插入單個文檔:
db.account.insert()
- 插入不能超過4MB;批量插入,最大消息不超過16MB。
- 插入原理:驅動將文檔轉爲bson,檢查是否有id鍵,傳入至數據庫,數據庫解析bson,不做有效性校驗,原樣存入數據庫。
- 插入單個文檔:
- 刪除
db.account.remove()
與db.account.drop()
區別;- remove不刪除索引,性能較差;drop刪除這個集合,性能較好;
- remove 需要查詢條件;drop不需要;
- 更新
db.account.update
加條件; unset;push,數組修改器;pop,數組尾刪屬性1,數組頭刪屬性-1;。- 多文檔更新:
db.account.update({},{},flase,true(多文檔更新))
db.account.update({_id:"123"},{$set:{password:'123'}})
db.runCommand({getLastError:1})
:執行getLastError時,驅動程序會等待數據庫返回結果;
mongodb 查尋語法
- 查詢所有文檔:
db.account.find();
- 簡單條件查詢:
db.account.find({'userName':'bbs0'})
; - 多值匹配條件:
db.account.find({name:"", pswd:""})
- 返回特定的屬性值:
db.account.find({},{add:""(返回指定 的屬性,設置1返回,0不返回)})
db.account.find({},{add:1,_id:0})//不返回id,返回add屬性;
- 複合查詢條件
- gte:表示大於等於,">="
- lte:表示小於等於,’<=’
- $ne:表示不等於,’!=’
- $in:查詢[]具體數據
- $nin: 查詢不是[]條件的數據
- $or:或查詢[]
- not:可以用於任何條件之上,表示取非;
db.account.find({age:{$lt:20}}) db.account.find({age:{$in:[18,20]}})// 查詢範圍18,20兩條 db.account.find({age:{$nin:[18,23]}}) // 查詢age不是18,23的兩條 db.account.find({$or:[{name:"test"},{age:18}]}) // name值爲test,或者age爲18
- 高級查詢 - null;
- 條件值:null,即匹配自身,又匹配不存在
- 若要查出準確的null值,需要結合KaTeX parse error: Expected '}', got 'EOF' at end of input: …ind({fullName:{in:[null],$exists:true}})`
- 條件值:null,即匹配自身,又匹配不存在
- 高級查詢 - 正則表達式:js;
- 遵尋js的正則表達式
db.accountfind({name:/^test/i}) //加前綴性能最佳。 db.account.find({name:/^[a-z]$/i})
- 高級查詢-查詢數組
db.food.insert({fruit:['apple','banana','peach']}) db.food.insert({fruit:['apple','banana','watermelon']}) db.food.insert({fruit:['apple','banana','cherry']})
- 單元素匹配
db.food.inster(fruit:'cherry')
- 多元素匹配
db.food.find({fruit:{$all:['apple','peach']}})
- 數組下標
db.food.find({'fruit.2':'cherry'})
- 指定數組長度
db.food.find({fruit:{$size:3}})
- 單元素匹配
- 高級查詢-內嵌文檔
- 點查尋
db.docment.find({'nameInfo.name':"ldy"})
- 內嵌文檔,多個鍵值匹配,採用KaTeX parse error: Expected '}', got 'EOF' at end of input: …nt.find({list:{elemMatch:{atr:“caixia”,scr:6}}})`
- 點查尋
- where 查詢
- 查詢文檔兩個屬性或者以上的值相等
- 不能用索引,並且文檔要從bson轉成javascript對象,查詢速度非常慢
db.food.find({ $where:function(){//js語法 for(var current in this){ for(var other in this){ if(current != other && this[current] == this[other]){ return true } } } return false; } })
- 遊標
-
定義遊標,不會立即執行:
var cursor = db.liu.find();
-
遊標迭代器:
while(cursor.hasNext()){ obj = cursor.next(); }
-
執行cursor.hasNext()時,查詢發送服務器,執行真正查詢,shell會獲取前100個或者4M數據(兩者較小)返回。
-
遊標一定得關閉:
cursor.close()
; -
限制數據結果:
db.liu.find().limit(5)
-
跳過匹配文檔:
db.liu.skip(5)
-
排序:sort 用一個對象作爲參數,鍵值表示,鍵對應文檔鍵名,值表示排序方向。1是生序,-1是降序。
db.liu.find().sort({ldy:1})
-
多鍵複合排序:
db.account.find.sort({userName:1,age:-1})
-
skip跳轉分頁:
db.liu.find({y:'post'}).limit(20).skip(20).sort({ldy:1})
; -
遊標原理:
- 服務端遊標消耗內存及資源,要儘快釋放;
- 遊標遍歷完成或者客戶端發消息終止釋放遊標;
- 遊標在客戶端不在作用域,驅動會向服務器發消息銷燬遊標;
- 超時銷燬機制,遊標即使在客戶端作用域內,但10分鐘不用,也會自動銷燬;
- 如果關閉遊標超時銷燬機制,遊標使用完,一定要顯示將其關閉,否則會一直消耗服務器資源。
-
- 索引創建
for(i = 0;i<10000;i++){ db.acount.insert({userName:"ldy"+i,age:i%60,createTime:new Date()}) }
- 單鍵索引:
db.account.ensureIndex({userName:1})
- 1–表示升序, -1 ---- 表示降序;
- 複合索引:
db.account.ensureIndex({userName:1,age:-1})
db.account.ensureIndex({userName:1,age:1,createTime:1})
- 只有索引前部的查詢纔會得到優化
- 索引優化查詢的同時,會對增刪改查帶來額外開銷。
- 查找系統索引:
db.acount.indexes.find()
- 單鍵索引:
- 唯一索引
- (查詢工具)[https://docs.mongodb.com/manual/reference/explain-results/#queryplanner]
db.acount.find({userName:1} ).explain( "executionStats" )
; - 索引:強制制定索引;
- hint可以強制制定索引某一個索引;
db.account.find().hint().explain()
- 自然選擇最優選項。
- 索引管理:
- 索引存儲每個數據庫的systems.indexs集合中這是一個保留的集合,不能直接對數據進行操作,只能通過ensureIndex和drop
Index來操作。 db.system.indexes.find()
db.system.namespaces.find()
- 修改索引:
db.account.ensureIndex({userName:-1},{'background':true})
,創建索引時,在後臺請求,不阻塞正常請求。 - 刪除索引
- db.runCommand({dropIndexes:“account”, index:“age_-1”})
- 聚合統計
count
:db.acount.count();db.account.count({age:30})
distinct
:- 指定鍵的不同值;
db.runCommand({'distinct':"acount",key:"age"})
;必須指定集合和鍵名。- 計算distinct後的count:
db.runCommand({'distinct':"acount",key:"age"}).values.length
; db.runCommand({'distinct':"acount",key:"age", query:{"age":{$gt:30}}}).values.length
- 分組:group
1.
- mongodb命令-db.runCommand({})
- 修復數據庫:{repairDatabase:1}
- 刪除集合:{drop:“collection”}
- 刪除當前數據庫:{dropDataBase:1}
- 刪除索引:{dropIndexes:collection, index:name}
- 查看主從服務器:{isMaster:1}
- 管理員專用:{listDatabases:1}
- 重命名:{renameCollection:a,to:b},必須是管理員才能修改。
- 設置密碼及用戶:
db.createUser({ user:name, pwd:password, roles:[{role:"useAdminAnyDatabase", db:"admin"},{role:'', db:"ldy"}] })
- read:讀取數據庫的權限
- redWrite:讀寫數據庫權限
- dbAdmin:執行管理庫
- root:只在admin數據庫中可用,超級權限,超級賬號;
- userAdmin:允許用戶向systems.users集合寫入,可以指定數據庫裏創建刪除和管理用戶