mongodb必須瞭解的基礎命令

  • nosql
    memcached緩存數據庫與redies緩存數據庫區別
    neo4j圖形數據庫

./mongod --shutdown 關閉進程

  • 開啓 mongo 數據庫
    mongod --dbpath D:\study\github\nodeKnowledge\study\mongodb\db --port 27018;

  • mongod 關閉.mongod --shutdown;

  • mongod 配置文件啓動:

    1. logpath=/ldy/mongodb/log/mongodb.log // 日誌文件; logappend=false dbpath=/ldy/mongodb/data/db // 數據文件; fork=true // 後臺,開啓子父進程; rest=true // 是否開啓web控制檯;
    • mongodb之shell腳本
    1. /mongo/bin/mongo:啓動mongo,開啓shell腳本。
    2. show dbs — 已有數據庫列表
    3. use dbname 切換並創建數據庫
    4. db.account.drop() 刪除集合
    5. db.dropDatabase() 刪除數據庫
    6. show collections 已有集合列表
    7. db.account.find() 查詢數據
    8. db.account.save({條件})存數據
    • mongodb之工具
    1. 數據庫備份:mongodump -h dbhost -d dbname -o dbdirectory
    2. 查看備份數據庫的數據:bsondump
      ./bsondump ./dump/ldy/account.bson
    3. 恢復數據庫:mongorestore -h dbhost -d dbname --dbdirectoryperdb dbdirectory
    4. 數據導出:mongoexport
    ./mongoexport -d ldy -c account -q {條件} -f name,add (屬性)--type=csv > account.csv
    
    1. 數據導入:mongoimport
     ./mongoimport  -d ldy  -c account  --type csv --headerline --drop< account.csv
    

    數據庫基本概念

    • 文檔,集合:沒有模式的表;
    • 文檔:多個鍵值有序存放在一起;單鍵值文檔和多鍵值文檔;區分數據類型,鍵區分大小寫,不允許重複的鍵;
    • 集合: 一組文檔,與sql表類似;集合無模式,有開發者把握;
    1. 集合不能有空字符串;
    2. 集合命名不能含有保留字符$;
    • 數據庫:一個mongod實列可以存放多個數據庫;全部小寫;不能空子符;系統保留數據庫,admin,local;
    1. local,永遠不會被複制;
    2. config: 內部使用,保存分片信息;
    3. 命名空間不能超過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()區別;
      1. remove不刪除索引,性能較差;drop刪除這個集合,性能較好;
      2. remove 需要查詢條件;drop不需要;
  • 更新
    • db.account.update加條件; set,使set用法,使用修改器進行局部更新;去掉鍵值:unset;inc:numberinc:對number類型進行加減,必須是數字;push,數組修改器;addToSet,addToSet, 不重複向數組填值;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屬性;
    
  • 複合查詢條件
    • gt:,>;gt: 表示大於,'>';gte:表示大於等於,">="
    • lt:<;lt:表示小於,'<';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}})`
  • 高級查詢 - 正則表達式: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});

    • 遊標原理:

      1. 服務端遊標消耗內存及資源,要儘快釋放;
      2. 遊標遍歷完成或者客戶端發消息終止釋放遊標;
      3. 遊標在客戶端不在作用域,驅動會向服務器發消息銷燬遊標;
      4. 超時銷燬機制,遊標即使在客戶端作用域內,但10分鐘不用,也會自動銷燬;
      5. 如果關閉遊標超時銷燬機制,遊標使用完,一定要顯示將其關閉,否則會一直消耗服務器資源。
  • 索引創建
    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:
    1. 指定鍵的不同值;
    2. db.runCommand({'distinct':"acount",key:"age"});必須指定集合和鍵名。
    3. 計算distinct後的count:db.runCommand({'distinct':"acount",key:"age"}).values.length;
    4. 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集合寫入,可以指定數據庫裏創建刪除和管理用戶

參考文檔

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