iT邦幫忙

6

MongoDB的條件操作符(2)

本文結構
$all : 匹配指定內容
$mod:取MOD後查詢
$size:取得node數量、長度
$type :指定資料的類型來查詢
$elemMatch : 資料符合查詢
$slice :針對array 元素進行切片操作
limit() 限制取得資料數量、skip() 跳過多少筆資料
教程視頻:將於1/30日晚間發佈視頻。
原發佈網址:http://mongodbcanred.blogspot.tw/2015/01/6mongodb2.html
在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)就是進階的查詢 ^ ^


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
一級屠豬士
iT邦新手 2 級 ‧ 2015-01-30 10:30:56

建議,可以的話,更換一下字型,別再沿用新細明體了,{} <> 的可讀性很差.

下面URL可以參考一下.
http://www.howtogeek.com/howto/windows-vista/stupid-geek-tricks-enable-more-fonts-for-the-windows-command-prompt/

http://www.wikihow.com/Customize-the-Font-in-Windows-Command-Prompt

canred iT邦新手 5 級 ‧ 2015-01-30 11:57:53 檢舉

好的…我下次發文的時侯會特別的注意一下 ^ ^ , 謝謝啦!

0
賽門
iT邦超人 1 級 ‧ 2015-01-30 14:43:53

如果可以在Linux平台上實作,會比在Windows平台更有感。

我要留言

立即登入留言