2015年1月13日 星期二

6.MongoDB的條件操作符(2)

教程視頻:將於1/30日晚間發佈視頻。

在MongoDB的條件操作符(1)介紹已經提出許多操作能力,但是好像還沒有介紹完成,所以在本文中主要補允未說明的指令為主。

在操作之前我需要為大家先準備好一些資料,以便後續的操作又及理解。

建立一個 Collection 名為 bookStore (書店)

1.先切換到 mydb 資料庫
  use mydb   

2.執行資料插入
 db.bookStore.insert([{    
   name: "storeA",    
   books: ["小說", "漫書", "商業期刊", "雜誌"],    
   startYear: 2015,    
   region: "台北"    
  }, {    
   name: "storeB",    
   books: ["商業期刊", "漫書", "雜誌"],    
   startYear: 2015,    
   region: "台北"    
  }, {    
   name: "storeC",    
   books: ["雜誌", "商業期刊"],    
   startYear: 2015,    
   region: "新竹"    
  }, {    
   name: "storeD",    
   books: ["小說", "漫書", "商業期刊", "雜誌"],    
   startYear: 2012,    
   region: "新竹"    
  }, {    
   name: "storeE",    
   books: ["商業期刊", "雜誌"],    
   startYear: 2011,    
   region: "台中"    
  }, {    
   name: "storeF",    
   books: ["漫書", "商業期刊"],    
   startYear: 2014,    
   region: "台中"    
  }, {    
   name: 123,    
   books: ["漫書", "商業期刊"],    
   startYear: 2014,    
   region: "台中"    
  }])  

3.驗証一下資料是否存在

  db.bookStore.find().count()  

是不是輸出有7筆資料。

現在我們的資料已經準備好了,就可以來練習find的語法。

$all : 匹配指定內容
比如說我們要找那些書店 有賣"商業期刊"而且也有"漫書" ?

  db.bookStore.find({    
   books: {    
   $all: ["商業期刊", "漫書"]    
   }    
  }).count() 
返回5筆資料

與下段程式是功能是相同的

  db.bookStore.find({    
   $and: [{    
   books: {    
    $in: ["漫書"]    
   }    
   }, {    
   books: {    
    $in: ["商業期刊"]    
   }    
   }]    
  }).count()   
返回5筆資料

但是我們在下語句,常常下成這樣,看似相同但是結果大不同,因為以下的
語句返回了 7 筆資料…,這是因為 他的查詢方式有關。

  db.bookStore.find({    
   books: {    
   $in: ["漫書","商業期刊"]    
   }    
  }).count() 
返回7筆資料

$mod:取MOD後查詢
說白話點就是先經由 取餘運算之後的結果 再來查詢啦!
以下語句是用來查找startYear 除 10 後等於1的資料。

  db.bookStore.find({    
   startYear: {    
   $mod: [10, 1]    
   }    
  })  




$size:取得node數量、長度
以下語句是用來 查找只賣2書籍的書店有幾家?

  db.bookStore.find({    
   books: {    
   $size: 2    
   }    
  })   



$type :指定資料的類型來查詢
以下語句是用來 查詢 name 欄位型別為 double 的書店?

  db.bookStore.find({    
   name: {    
   $type: 1    
   }    
  })   

type對應類型表如下:


$elemMatch : 資料符合查詢
在練習elemMatch指令之前我們需要先修改一下原來的資料,為每一間書店加上店員資訊。
這邊將使用到 更新操作符 $SET , 這次最主要是更新新增一個欄位為 employee 表示店員資訊;而employee 是一個Array,儲存著店員相關資料(name,age,salary)。

簡單的來說 elemMatch指令 是可以對內含的對象再進行條件查詢使用的。

以下是更新語句

 db.bookStore.update({name:"storeA"},{   
    $set:{   
       employee:[   
         {name:'小王',age:18,salary:100},   
         {name:'小李',age:19,salary:110}   
       ]   
    }   
  });   
  db.bookStore.update({name:"storeB"},{   
    $set:{   
       employee:[   
         {name:'小陳',age:20,salary:100},   
         {name:'小劉',age:21,salary:110}   
       ]   
    }   
  });   
  db.bookStore.update({name:"storeC"},{   
    $set:{   
       employee:[   
         {name:'小一',age:22,salary:100},   
         {name:'小二',age:21,salary:110}   
       ]   
    }   
  });   
  db.bookStore.update({name:"storeD"},{   
    $set:{   
       employee:[   
         {name:'張三',age:23,salary:100},   
         {name:'李四',age:25,salary:110}   
       ]   
    }   
  });   
  db.bookStore.update({name:"storeE"},{   
    $set:{   
       employee:[   
         {name:'老王',age:24,salary:100},   
         {name:'趙六',age:23,salary:110}   
       ]   
    }   
  });   
  db.bookStore.update({name:"storeF"},{   
    $set:{   
       employee:[   
         {name:'王九',age:26,salary:100},   
         {name:'黃十',age:18,salary:110}   
       ]   
    }   
  });   
  db.bookStore.update({name:123},{   
    $set:{   
       employee:[   
         {name:'大王',age:31,salary:100},   
         {name:'大李',age:20,salary:110}   
       ]   
    }   
  });   

我們現在需要查出那一個書店有18歲的店員,可以使用下列語句

  db.bookStore.find({   
    employee:{   
       $elemMatch:{   
         age:18   
       }   
    }   
  }) 

我們現在需要查出那一個書店的店員年齡大於等於30歲,可以使用下列語句

  db.bookStore.find({   
    employee:{   
       $elemMatch:{   
         age:{ $gte:30 }   
       }   
    }   
  })   

$slice :針對array 元素進行切片操作
取得所有書店的第一本書
  db.bookStore.find({}, {  
   books: {  
    $slice: [1, 1]  
   },  
   _id: 0,  
   name: 1  
  }).pretty()  

執行結果


limit() 限制取得資料數量、skip() 跳過多少筆資料

一般來說功能用來實現分頁的功能,因為這一個功能比較easy…
大家直接看執行語句與執行結果就可以了解。
1.首先執行

 db.bookStore.find({}, {  
  name: 1,  
  _id: 0  
 })  

執行結果:查到7筆資料



2.使用skip指令

 db.bookStore.find({}, {   
  name: 1,   
  _id: 0   
  }).skip(1)  

執行結果:查到6筆資料


3.使用limit指令(限制資料量)


  db.bookStore.find({}, {  
   name: 1,  
   _id: 0  
  }).skip(1).limit(2) 

執行結果:查到2筆資料


下節教程內容為 MongoDB 的條件操作符(3)就是進階的查詢 ^ ^

1 則留言: