1. 程式人生 > >Mongodb學習筆記速記(一)

Mongodb學習筆記速記(一)

一.   安裝mongodb

2.      在D盤新建資料夾 mongodb,複製解壓後的檔案到這裡

3.      把mongodb資料夾的路徑追加到系統變數path後面

4.      在D盤新建一個資料夾命名為mongodbData,用於存放mongodb的資料

5.      把開cmd,進入mongodb資料夾下的bin,執行:  mongod –dbpathd:\mongodbData

6.      獲得埠號27017, 安裝完畢

二.   啟動mongodb

1.      建立快速啟動檔案mongodb.bat

d: && mongod--dbpath D:\MongodbData

2.      新建資料庫

建立快速檔案 mongodb27017.bat

mongo127.0.0.1:27017/admin

建立新資料庫 use [databasename]  如: use foobar

給指定資料庫新增集合並新增記錄 db.[documentName].insert({…})

db.persons.insert({name:”uspcat”})

db表示本資料庫,persons為集合

3.      檢視資料庫 show dbs

4.      檢視所有文件 show collections  //persons(新建立)    system.indexes (系統生成,負責儲存索引)

5.      查詢指定文件資料db.[documentName].find()       

//查詢第一條 db.[documentName].findOne()

db.system.indexes.find()  

//db.persons.find()

6.      更新文件db.[documentName].update({查詢條件},{更新內容})  ///$set 修改器

db.persons.update({name:”extjs4.0”},{$set:{name:”extjs4.1”}})

7.      刪除文件db.[documentName].remove({要刪除的物件})

db.persons.remove({age:1})

8.      刪除庫中的集合 db.[documentName].drop()

db.persons.drop()

9.      刪除資料庫db.dropDatabase()

10.  Shell的help 

全域性資料庫db.help() 

集合 db.[documentName].help()

11.  資料庫和集合命名規範

不能是空字串

不得含有 ‘ ‘ (空格) 、‘,` % / \ 和空字元

應全部小寫

最多64個位元組

資料庫名不能和現有系統保留庫同名, 如 admin, local, config

12.  例外合法的命名(避免使用)

db-text 但是不能能過db.[documentName]得到,要改用db.getCollection(documentName),因為會被當作是減法操作

db.getCollection(“db-text”).text.insert({name:”mick”})

13.  內建js引擎,可以直接執行js(任何)程式碼

Function insert(object){

            db.getCollection(“db-text”).text.insert(object)

}

Insert({age:32})

使用eval

db.eval(“return  ‘uspcat’”)

三.   增刪改查

1.      插入文件db.[documentName].insert({})

db.persons.insert({_id:”001”,name:”yun”})

2.      批量插入文件(shell不支援批量插入, 要用for迴圈完成或者mongo驅動)

for(vari=0;i<10;i++){

            db.persons.insert({name:i})

}

3.      save操作 ( 當插入時遇到_id相同的情況,insert會報錯,而用save則會變成更新操作,把_id物件的內容替換.

db.persons.save({_id:”001”,name:i})

4.      刪除列表中所有資料db.[documentName].remove()

集合的本身和索引不會被刪除: show collections  /db.system.indexes.find()

5.      根據條件刪除(刪除指定的資料 db. [documentName].remove(條件))

db.persons.remove({_id:1}))

(如果集合中要刪除的很多,建議刪除正合集合再重新建立)

6.      強硬的文件代換式更新操作(會用新的文件替換舊文件)

db.[documentName].update({查詢器},{修改器})

(如替換後的_id和現有的_id衝突,系統將報錯)

7.      update的第三個引數 insertOrUpdate , 查詢器能查出來就更新,查不出來就插入

db.[documentName].update({查詢器},{修改器},true)

8.      批量更新操作 當查出多條資料時預設修改第一條資料,如要實現批量修改,需要第四個引數 db.[documentName].update({查詢器},{修改器},false,true)

四.   修改器

1.      $set 用來指定一個鍵值,如果已存在就修改否則新增{$set{field:value}}

db.persons.update({name:4},{$set:{name:”uspcat”}})

2.      $inc 只使用於數字型別, 他可以為指定的鍵對應的數字型別的數值進行加減操作{$inc:{field:value}}

db.persons.update({age:27},{$inc:{age:1}})   ////{“_id”:0“, age”:28}

3.      $unset 刪除指定的鍵 {$unset:{field:1}}

db.persons.update({age:28},{$unset:{age:1}})

4.      $push 如指定的鍵是陣列則追加,否則中斷報錯,如果不存在則建立陣列 {$push:{field:value}}

db.persons. update({_id:5},{$push:{books:”JS”}})

5.      $pushAll 批量新增陣列資料, 用法與$push類似 {$pushAll:{field:array}}

db.persons.update({_id:5},{$pushAll:{books:[“EXTJS”,”JS”]}})

6.      $addToSet 往指定鍵值的陣列新增, 當目標陣列存在則不操作,不存在則新增 {$addToSet:{field:value}}

{$addToSet:{books:”JS”}}

7.      $pop 從指定陣列刪除一個值  1 表示刪除最後一個值, -1表示刪除第一個值{$pop:{field:value}}

{$pop:{name:1}}

8.      $pull 刪除被指定的值 {$pull:{field:value}}

{$pull:{“book”:”JS”}}

9.      $pullAll 一次性刪除多個指定的數值 {$pullAll:{field:arry}}

{$pullAll:{“name”:[“JS”,”JAVA”]}}

10.  陣列定位器($) 如值內有多個數組,只想操作一部份

{name:”YFC”,age:27,books:[{type:”JS”,name:”EXTJS4”},{type:”JS”,name:”JQUERY”}]}

要向type為JS的文件增加一個作者 author:USPCAT

db.text.update({“books.type”:”JS”},{$set:{“books.$.author”:”USPCAT”}})

上面提到的修改器,都是放在物件的前面{$set:{“books.$.author”:”USPCAT”}},後面要學的查詢器是放到物件內層

11.  批量陣列更新 $addToSet與 $each結合db.text.update({_id:100},{$addToSet:{books:{$each:[“JS”,”DB”]}}})

$each會迴圈後面的陣列把每一個數值進行$addToSet操作

12.  記憶體分配與查詢效率

Document被建立的時候,DB為其分配記憶體和預留記憶體,當修改操作不超過預留記憶體的時候,速度非常快,如果超過了則會分配新的記憶體而消耗時間.

五.   mongoDB的特殊函式 (runCommand函式專門用於執行特殊函式)

1.      findAndModify 特殊函式,用於返回update或remove後的文件,一次只能處理一個文件,也不能執行upsert操作,只能更新已有文件.

runCommand({“findAndModify”:”processes”,query:{查詢器},sort{排序},new:true}).value///update:{更新器},remove:true

           ps=db.runCommand({

                    “findAndModify”:”persons”,         //指定資料集合

                    “query”:{“name”:”text”},           //查詢物件,只能針對單文件

                    “update”:{“$set”:{“email”:”1221”}},  //修改器

                    “new”:true                      //

}).value

Do_something(ps)

六.   查詢

1.      指定返回的鍵

db.[documentName].find({條件},{鍵指定})

資料準備->persons.json

查詢所有資料的指定鍵(name,age,country)

db.persons.find({},{name:1,age:1,countru:1,_id:0})   // 1表示查詢, 0表示不查

2.      查詢條件 (為空表示不限條件)

$lt      <   {age:{$gte:22,$lte:27}}  ///大於等於22,小於等於27

$lte    <=

$gt     >

$gte    >=

$ne     !=   {age:{$ne:26}}

db.persons.find({age:{$gte:25,$lte:27}},{_id:0,name:1,age:1})  //查詢年齡在25至27之間

db.persons.find({country:{$ne:”Korea”}},{_id:0,m:1})         //查詢不是韓國的學生的數學成績

3.      $in 或 $nin (包含或不包含)

db.persons.find({country:{$in:[“USA”,”China”]}})          //查詢中國和美國的學生

db.persons.find({country:{$nin:[“USA”,”China”]}})         //查詢非中國和美國的學生

4.      $or查詢

db.persons.find({$or:[{cn:{$gt:85}},{en:{$gt:90}}]},{_id:0,e:1,c:1,name:1})

//查詢語文成績大於85 或者英語成績大於90的學生

5.      null 查詢此項為null的資訊

db.persons.find({sex:{$in:[null]}},{_id:0,name:1,sex:1})

//查詢性別為null的學生

6.      使用正則查詢

db.persons.find({name:/li/i},{_id:0,name:1})  //查詢名字中存在li的學生

7.      $not 可以用在任何地方進行取反操作

db.persons.find({name:{$not:/li/i}},{_id:0,name:1})

//$not和$nin的區別是,$not可以用在任何地方,$nin只用在集合上

8.      陣列查詢$all和index應用

//查詢所有喜歡MONGODB和JS的學生

db.persons.find({books:{$all:[“MONGODB”,”JS”]}},{books:1,_id:0})

//查詢第二本書是JAVA的資訊

db.persons.find({“books.1”:”JAVA”},{_id:0,name:1})

9.      查詢指定長度陣列$size, 不能與比較查詢符一起使用()

//查詢喜歡書籍數量為4本的學生

db.persons.find({books:{$size:4}},{_id:0,name:1})

//查詢喜歡書籍大於3本的學生

//1.增加欄位用於統計

db.persons.update({},{$set:{size:4}},false,true)

//2.改變書籍的更新方式,每次增加書籍時,size加1

db.persons.update({name:”jim”},{$push:{books:”ORACLE”},$inc:{size:1}})

//3.利用$gt查詢

db.persons.find({size:5},{_id:0,name:1,sex:1})  //db.persons.find({size:{$gt:3}})

//利用shell查詢Jim喜歡看的書的數量

var persons =db.persons.find({name:”Jim”})  //多個

while(persons.hasNext()){                                      //遍歷郵標

            obj=persons.next();

            print(obj.books.length)

}

Shell是個徹底的JS引擎,但是一些特殊的操作要靠各個驅動來完成(JAVA,NODEJS)

10.  $slice操作符返回文件中指定陣列的內部值

//查詢Jim書架中第二至四本書

db.persons.find({name:”Jim”},{books:{$slice:[1,3]},_id:0})

//查詢最後一本書

db.persons.find({name:”Jim”},{books:{$slice:-1},_id:0})

11.  文件查詢

為Jim新增學習簡歷文件 jim.json

//查詢出在K學校上過學的學生

//問題1 侷限,用絕對匹配可以完成,完全匹配,查詢順序也要一致

db.persons.find({school:{school:”K”,score:”A”}},{_id:0,school:1})

//問題2 順序問題可以用 物件”.” 的方式定位,但是會附帶陣列內其他元素的查詢score

db.persons.find({“school.score”:”A”,”school.school”:”K”},{_id:0,school:1})

//正確做法,使用單條條件組查詢$elemMatch,會將查詢條件當成一個組合,進行遍歷,只有滿足組合所有條件的

db.persons.find({school:{$elemMatch:{school:”K”,score:”A”}}},{_id:0,school:1})

12.  $where 查詢複雜資訊,萬能查詢,但是會消耗效能,儘量減少使用

//查詢年齡大於22歲,喜歡看C++書,在K學校上過學的學生

db.persons.find({“$where”:function(){

           //得到查詢文件的每一條文件

           var books=this.books;

           //得到文件中的school物件

           var school=this.school;

           if(this.age>22){

                    var php=null;

                    //遍歷書籍

                    for(var i=0;i<books.length;i++){

                             if(books[i]==”C++”){

                                      php=books[i];

                                       //如果學校為真

                                      if(school){

                  for(varj=0;j<school.length;j++){

                            //判斷是否在K上過學

                            if(school[j].school==”K”){

                                     return true;

}

}

break;

}

}

}

}

}})