顯示具有 mongod 標籤的文章。 顯示所有文章
顯示具有 mongod 標籤的文章。 顯示所有文章

2015年1月12日 星期一

4.MongoDB的條件操作符(1)

教程視頻:
                


  • 結文結構:
    • 1.MongoDB常用的查詢條件介紹
    • 2.使用find指令範例(基礎)
    • 3.條件操作符的使用


在介紹『條件操作符』之前先要了解一下 find 指令,我們來看一下 find 指令的結構。

 db.collection.find(  
   {條件},  
   {鍵指定}  
 )  

參數說明
    條件    :條件操作符物件
    鍵指定:想要顯示的欄位


在使用 find 前我們需要準備一些資料,以利學習,我們要下載一下範本的資料表,然後使用mongoimport指令將資料匯入我們的資料庫中。

操作步驗如下:

1.下載 JSON file  (http://media.mongodb.org/zips.json)
2. 匯入資料
    mongoimport.exe --db mydb  --file ../zips.json
    
   connected to: 127.0.0.1  
   no collection specified!  
   using filename 'zips' as collection.  
   2015-01-12T09:30:55.804+0800 check 9 29353  
   2015-01-12T09:30:55.811+0800 imported 29353 objects  

3.當出現imported 29353 時則表示資料已成功匯入了,我們再使用
   mongo指令連接到你的server中查到一下。

   3.1 使用use mydb 切換資料庫
   3.2 使用 db.zips.find().count() 是否有輸出有 29353 筆資料


*使用find指令範例(基礎)
    1.查詢全部的資料

     db.zips.find()
       或是
       db.zips.find({ })

      查詢結果如下圖
  

       注意:mongo在查詢資料時侯是有限制顯示筆數。有像是20筆,
                  如你要看下一頁的資料請鍵入 it 後按下 Enter 鍵即可,查看下一頁。

  2.限制顯示的欄位
       這一個操作就像是SQL中的顯示數位


     SELECT CITY FROM ZIPS  

      在find的指令的第2個引數就是來完成相同的操作,但有一點必須注意就
      是 _id 是預設顯示的,如果你不想看見的話,把他設定成 0 。 如下操作



     db.zips.find({},{_id:0 , city:1}) 

      * 0 表示不要顯示此欄位
         1 表示要顯示此欄位

      查詢結果如下圖
      
3.限制顯示的欄位 + 排序
     使用sort指令直接連綴在find指令之後,就像是JQuery的語法。
     sort的格式為
    ( {欄位:排序方式} )  

     *排序方式 等於 『  1 』時表示正向排序就是SQL中的ASC

     *排序方式等於  『- 1』時表示反向排序就是SQL中的DESC


 db.zips.find({},{city:1,_id:0}).sort({city:1})  

     查詢結果如下圖
    

現在大家都應該了解基本的find指令的運用了吧,接下來就是條件操作符的使用,以下內文擷於http://docs.mongodb.org/manual/reference/operator/query/,在這篇文章的內容說真的要詳細說明的話要花費不少的時間,所以我只針對find指令會用到的條件操作符做說明( Comparison , Logical , Element , Evluation),另外黃底部份是我額外的說明或程式碼範例。

Comparison

For comparison of different BSON type values, see the specified BSON comparison order.
NameDescription
$gtMatches values that are greater than the value specified in the query.
大於 ( > )
使用範例:
  db.zips.find(  
   {  
     pop: { $gt:100000 }  
   }).count() 
將返回 4 筆資料
$gteMatches values that are greater than or equal to the value specified in the query.
大於等於 ( >= )使用範例: 
 db.zips.find(  
   {  
     pop: { $gte:100000 }  
   }).count() 
將返回 4 筆資料
$inMatches any of the values that exist in an array specified in the query.
包含 使用範例:
 db.zips.find(  
   {  
     city: { $in:['NEW YORK'] }  
   }).count()  
將返回 40 筆資料
$ltMatches values that are less than the value specified in the query.
小於  ( < )
使用範例:
db.zips.find(
    {
        pop:  {  $lt:100  }
    }).count()
將返回 701 筆資料
$lteMatches values that are less than or equal to the value specified in the query.
小於等於  ( <= )
使用範例:
 db.zips.find(  
   {  
     pop: { $lt:100 }  
   }).count() 
將返回 706 筆資料
$neMatches all values that are not equal to the value specified in the query.
不等於 ( != )
使用範例:
 db.zips.find(  
   {  
     city: { $ne:'NEW YORK' }  
   }).count()  
將返回 29313 筆資料
$ninMatches values that do not exist in an array specified to the query.
不包含使用範例:
 db.zips.find(  
   {  
     city: { $nin:['NEW YORK'] }  
   }).count() 
將返回 29313 筆資料

Element

Logical

NameDescription
$andJoins query clauses with a logical AND returns all documents that match the conditions of both clauses.
並且 ( && )
db.zips.find({
   $and:[
              {city:"AGAWAM"},
              {pop:15338}
            ]
})
$norJoins query clauses with a logical NOR returns all documents that fail to match both clauses.
或取反 ! ( or ) ,也就是找不符合條件的資料
 db.zips.find({  
   $nor: [{  
     city: 'NEW YORK'  
   }, {  
     city: 'CHICAGO'  
   }]  
 }).count()  
將返回 87 筆資料
$notInverts the effect of a query expression and returns documents that do not match the query expression.
返選操作
*取得city 不包含 NEW 字眼的所有城市
 db.zips.find({  
   city: {  
     $not: /NEW/i  
   }  
 }).count()  
將返回 28879 筆資料

$orJoins query clauses with a logical OR returns all documents that match the conditions of either clause.
或  ( or )
 db.zips.find({  
   $or: [{  
     city: 'NEW YORK'  
   }, {  
     city: 'CHICAGO'  
   }]  
 }).count()  

Evaluation

NameDescription
$modPerforms a modulo operation on the value of a field and selects documents with a specified result.
$regexSelects documents where values match a specified regular expression.
使用正則式查詢
 db.zips.find({  
   city: /^NEW/i  
 }).count()  
$textPerforms text search.
$whereMatches documents that satisfy a JavaScript expression.
進階的查詢功能,一但使用到這一個功能查詢的速度可以會下降,但他的功能算是更強大的
db.zips.find({
            $where: function() {
             if(this.state=='MA' && this.city.indexOf('EAST') >= 0 ){
                return true;
             }
             if(this.state=='WA' && this.city.indexOf('EAST') >= 0 ){
                return true;
             }
             return false;
            }
        })
返回的資料筆數為 18 筆 。

NameDescription
$existsMatches documents that have the specified field.
欄位存在檢查操作
我們先執行一個更新操作



 db.zips.update({  
   _id: "01001"  
 }, {  
   $set: {  
     test: 'test'  
   }  
 }) 

我們必須先更新 _id 為 01001 這一筆資料,插入一個新的欄位為

test;接下來我們可以用測式exists指令了,我們要找有test欄位的
文檔就可以透過下列指令完成。


 db.zips.find({  
   test: { $exists : 1 }  
 }) 

返回資料為:
{ "_id" : "01001", "city" : "AGAWAM", "loc" : [ -72.622739, 42.070206 ], "pop" :
 15338, "state" : "MA", "test" : "test" }

$typeSelects documents if a field is of the specified type.
請參考 http://docs.mongodb.org/manual/reference/operator/query/type/ ,因為這一個操作比較少使用,我就不多說了。

最後出幾個綀習題

1.在zips中查出不重覆的city名稱,並且使用city作排序由小到大
db.zips.distinct("city").sort({city:1})


2.在zips中查出status 為 WA 或 AL 的所有城市名稱?
> db.zips.find({ state :{$in:['WA','AL']}  }).count()

3.在zips中查出_id值大於等於10000 並且 小於等於 100100 的city有那一些?
> db.zips.find({ $and:[{ _id : { $gt:'10000' }},{_id:{$lt:'100100'}}]  })

4.使用正則式找到 city 以EAST 開頭 ,並且結尾字母為N的城市?
> db.zips.find({city:/^EAST.+N$/i}).count()

PS:不熟悉正則表達式的人可以 參考一下這篇文章
      http://openhome.cc/Gossip/JavaGossip-V1/RegularExpression.htm

下節教程內容為 MongoDB的條件操作符(2)

2015年1月6日 星期二

2.安裝MongoDB



安裝MongoDB

教學視頻
            

  • 文本結構:
    • 1.手把手教學視頻教你如何安裝(MongoDB)
    • 2.了解Mongod相關的引數
    • 3.驗証Mongo是否已經正常運行
    • 4.如何正確的關閉資料庫
  1. 下載MongoDB到Mongo的官網下載 http://www.mongodb.org/downloads 

    請選擇你合適的os版本,為了教學方便我是選擇windows 32bit的版本,基本上我是下載zip的版本,大約110MB左右。
    將下載的ZIP解壓到D:/MongoDB中,以下是我的執行畫面


    現在你可已經安裝完成了,是不是很easy 啊!但是 mongo 預設是沒有自動啟動的所以我們需要手動啟動MongoDB Server 。
  2. 建立新資料夾給資料庫使用
    在D:/MongoDB下先建立二個資料夾,來存放MongoDB的資料庫
    分別為D:/MongoDB/Data , D:/MongoDB/Data/mydb 
  3. 執行Mongod指令來啟動MongoDB Server
    打開 cmd 視窗並移到d:/mongodb/bin的資料夾下
    執行 mongod --dbpath ../data/mydb

    執行畫面如下,當你看見MongoDB staring : pid = xxx port = 27017 dbpath=....時則表示你可以順利啟動MongoDB了。

    由於Mongod 的啟動引數有很多我將附上一個列表有興趣的人可以參考
  4. 了解Mongod相關的引數,參數資訊來至於 http://blog.csdn.net/fdipzone/article/details/7442162 ,另外比較重要的參數我將以紅色標記,因為引數實在太多了,我將在這次的教程中也只可能介紹到4成左右。
    mongod的主要參數有:   

    --quiet# 安靜輸出
    --port # 指定服務端口號,默認端口27017
    --bind_ip # 綁定服務IP,若綁定127.0.0.1,則只能本機訪問,不指定默認本地所有IP
    --logpath# 指定MongoDB日誌文件,注意是指定文件不是目錄
    --logappend# 使用追加的方式寫日誌
    --pidfilepath# PID File 的完整路徑,如果沒有設置,則沒有PID文件
    --keyFile# 集群的私鑰的完整路徑,只對於Replica Set 架構有效
    --unixSocketPrefix# UNIX域套接字替代目錄,(默認為/tmp)
    --fork# 以守護進程的方式運行MongoDB,創建服務器進程
    --auth# 啟用驗證
    --cpu# 定期顯示CPU的CPU利用率和iowait
    --dbpath# 指定數據庫路徑
    --diaglog#diaglog選項0 =關閉1 = W 2 = R 3 = 7兩種= W +讀一些
    --directoryperdb# 設置每個數據庫將被保存在一個單獨的目錄
    journal# 啟用日誌選項,MongoDB的數據操作將會寫入到journal文件夾的文件裡
    --journalOptions# 啟用日誌診斷選項
    --ipv6# 啟用IPv6選項
    --jsonp# 允許JSONP形式通過HTTP訪問(有安全影響)
    --maxConns# 最大同時連接數默認2000
    --noauth# 不啟用驗證
    --nohttpinterface# 關閉http接口,默認關閉27018端口訪問
    --noprealloc# 禁用數據文件預分配(往往影響性能)
    --noscripting# 禁用腳本引擎
    --notablescan# 不允許表掃描
    --nounixsocket# 禁用Unix套接字監聽
    --nssize# 設置信數據庫.ns文件大小(MB)
    --objcheck# 在收到客戶數據,檢查的有效性,
    --profile ARG# 檔案參數0=off 1=slow, 2=all
    --quota# 限制每個數據庫的文件數,設置默認為8
    --quotaFiles#數量每分貝文件allower的,需要--quota
    --rest# 開啟簡單的rest API
    --repair# 修復所有數據庫run repair on all dbs
    --repairpath# 修復庫生成的文件的目錄,默認為目錄名稱dbpath
    --slowms對於個人資料和控制台日誌#緩慢值
    --smallfiles# 使用較小的默認文件
    --syncdelay# 數據寫入磁盤的時間秒數(0=never,不推薦)
    --sysinfo# 打印一些診斷系統信息
    --upgrade# 如果需要升級數據庫

    * Replicaton參數 

    --fastsync# 從一個dbpath裡啟用從庫複​​製服務,該dbpath的數據庫是主庫的快照,可用於快速啟用同步
    --autoresync# 如果從庫與主庫同步數據差得多,自動重新同步,
    --oplogSize# 設置oplog的大小(MB)

     *主/從參數 

    --master# 主庫模式
    --slave# 從庫模式
    --source # 從庫端口號
    --only # 指定單一的數據庫複製
    --slavedelay# 設置從庫同步主庫的延遲時間

     * Replica set(副本集)選項: 

    --replSet# 設置副本集名稱

     * Sharding(分片)選項 

    --configsvr# 聲明這是一個集群的config服務,默認端口27019,默認目錄/data/configdb
    --shardsvr# 聲明這是一個集群的分片,默認端口27018
    --noMoveParanoia# 關閉偏執為moveChunk數據保存
  5. 驗証Mongo是否已經正常運行
    打開 cmd 視窗並移到d:/mongodb/bin的資料夾下
    執行 mongo 



    正常狀況下…
    mongo指令會連接本機的27017 port ,這是因為我們在啟動mongod 的時侯沒有使用到--port 引數所以預設就是27017。當你看見執行視窗的 connection to : test 字句,表示你已經順利連接到MongoDB了。
  6. 查看資料庫執行 show dbs ,你將看見2個資料庫分別是admin , local 
  7. 關閉資料庫
    個人認為正常的方式關閉資料庫是非常重要的,所以特別在此說明。因不正常的關閉資料庫可能會造成資料庫鎖未被釋放記憶體中的資料來不及同步日誌損壞等等。所以在此希望大家使用db.shutdownServer()指令來關閉資料庫,在使用這一個指令的時侯要先切換到admin資料庫可以執行這一個執指。
    use admin db.shutdownServer()
    執行畫面如下:

下節課程學習到Mongo的基本操作

  1. 查看資料庫、查看collection
  2. 建立第一個資料庫
  3. 建立第一筆文檔
  4. 查詢文檔案

待續…