1. 程式人生 > >學習MongoDB 五: MongoDB查詢(陣列、內嵌文件)(二)

學習MongoDB 五: MongoDB查詢(陣列、內嵌文件)(二)

一、簡介

        我們上一篇介紹了db.collection.find()可以實現根據條件查詢和指定使用投影運算子返回的欄位省略此引數返回匹配文件中的所有欄位,我們今天介紹了對陣列和內嵌文件的查詢操作,尤其是對$elemMatch 同樣可以用在find方法的第二個引數來限制返回陣列內的元素,只返回我們需要的文件的介紹。我們經常在查詢條件查詢內嵌文件陣列時,只需要返回主文件並返回內嵌文件陣列中我們只需要的值,而不是把內嵌文件的陣列都返回。

二、對陣列根據條件查詢

   $all、$size、$slice、$elemMatch

(1)$all查詢陣列中包含指定的值的文件

     語法:

        { field:{ $all: [ <value> , <value1> ... ]}

     

   例子:

     db.orders.find({"books":{$all:["java","mongo"]}})

      

     查詢books包含java、mongo的文件資料

(2)$size 查詢陣列大小等於指定值的文件

     語法:

   {field: {$size: number } }

      例子:

          >db.orders.find({"books":{$size:2}})

       

(3)$slice查詢陣列中指定返回元素的個數

      語法:

         >db.collect.find({},{field:{$slice: number }})

      number 說明:

         為正數表示返回前面指定的值的個數:例如1 返回陣列第一個

         為負數表示返回倒數指定的值的個數:例如-1返回陣列倒數第一個

      例子:

        >db.orders.find({"onumber":{$in:["008","009"]}},{books:{$slice:1}})

          

    1)$slice可以查詢陣列中第幾個到第幾個

        語法:

            >db.collect.find({},{field:{$slice:[ number1, number2] }})

       跳過陣列的number1個位置然後返回number2個數

       number1說明:

          為正數表示跳到指定值的陣列個數:例如2 跳到陣列第3個

          為負數表示跳到指定值的陣列倒數個數:例如-2跳到到陣列倒數第3個

       例子:

           >db.orders.find({"onumber":{$in:["008","009"]}},{books:{$slice:[1,1]}})

         

         跳過books陣列第一個元素,現在到陣列第二個元素,並返回1個元素

三、對陣列內嵌文件查詢

      我們先儲存資料

<span style="font-size:18px;"> 
db. orders.insert([
{
        "onumber" : "001", 
        "date" : "2015-07-02", 
        "cname" : "zcy1", 
         "items" :[ {
                   "ino" : "001",
                  "quantity" :2, 
                  "price" : 4.0
                 },{
                   "ino" : "002",
                  "quantity" : 4, 
                  "price" : 6.0
                }
                ]
},{
         "onumber" : "002", 
        "date" : "2015-07-02", 
        "cname" : "zcy2", 
         "items" :[ {
                  "ino" : "001",
                  "quantity" :2, 
                  "price" : 4.0
                   },{
                  "ino" : "002",
                  "quantity" :6, 
                  "price" : 6.0
                 }
               ]
}
])</span>

 (1)$elemMatch 文件包含有一個元素是陣列,那麼$elemMatch可以匹配內陣列內的元素並返回文件資料

     語法:

         >{field:{$elemMatch:{ field1:value1, field2:value2,………}}}

   例子:

         >db.orders.find({"items":{$elemMatch:{"quantity":2}}})

      

      返回quantity為2的文件

   也可以這樣查詢db.orders.find({"items.quantity":2})

      

(2) $elemMatch可以帶多個查詢條件

   例子:

      >db.orders.find({"items":{$elemMatch:{"quantity":4,"ino":"002"}}})

      

      我們查詢陣列中的quantity等於4並且ino等於002,但是我們就想返回陣列中的quantity等於4並且ino等於002的這個文件,並不想把ino等於001等這些無關的文件返回。

(3)$elemMatch 同樣可以用在find方法的第二個引數來限制返回陣列內的元素,只返回我們需要的文件

   例子:

         db.orders.find({"onumber":"001"},{"items":{$elemMatch:{"quantity":4,"ino":"002"}},"cname":1,"date":1,"onumber":1})

         

 我們只返回quantity等於4並且ino等於002的文件,無關的文件沒有返回,方便我們處理資料,這樣也可以節省傳輸資料量,減少了記憶體消耗,提高了效能,在資料大時,效能很明顯的。