本篇文章將要說明其它幾個搜尋方法,包含如何搜尋document中的陣列欄位的值以及運用正規表達式regex 來進行搜尋。
這邊我們將要介紹幾個陣列搜尋符號$all、$size、$slice。
| Tables | Are |
|---|---|
$all |
當需要尋找多個元素節合的document時,就可以使用它 |
$size |
當要尋找特定長度的陣列時,就可以用它~ |
$slice |
可以指定回傳的陣列指定的範例 ex. 10就為前十條,-10就為後十條。 |
$elemMatch |
它會只針對陣列,進行多組query。 |
假設情況我們collection中有下列document。
{"id":"1","name":"mark",
"fans":["steven","stanly","max"],
"x":[10,20,30]};
{"id":"2","name":"steven",
"fans":["max","stanly"],
"x":[5,6,30]};
{"id":"3","name":"stanly",
"fans":["steven","max"],
"x":[15,6,30,40]};
{"id":"4","name":"max",
"fans":["steven","stanly"],
"x":[15,26,330,41,1]};
fans中同時有steven、max的網紅我們這時就可以使用$all。
db.user.find({"fans":{"$all":["steven","max"]}})
結果如下,應該是只找到mark、stanly這兩個人。

fans總共有三位的網紅。我們這時可以用$size,不過有點可惜的一件事,$size無法與搜尋條件(ex.$gte)使用,所以無法尋找3人以上之類的,通常要來實現這種需求就只能多加個欄位了。
我們來看看$size的使用方法。
db.user.find({"fans":{"$size" :3}})

mark的第一個fans。$slice主要功能就是將陣列切割只回傳你指定的範例。
db.user.find({"name":"mark"},{"fans":{"$slice":1}})

x中至少有一個值為大於30小於100的網紅。db.user.find({"x":{"$elemMatch" : {"$gt" : 30 , "$lt" : 100}}})

mongodb當然有提供正規表達式的搜尋,如果你正規表達式夠強,那幾乎可以直接找到你所有想要的資料。
測試資料如下,事實上和上面一樣。
{"id":"1","name":"mark",
"fans":["steven","stanly","max"],
"x":[10,20,30]};
{"id":"2","name":"steven",
"fans":["max","stanly"],
"x":[5,6,30]};
{"id":"3","name":"stanly",
"fans":["steven","max"],
"x":[15,6,30,40]};
{"id":"4","name":"max",
"fans":["steven","stanly"],
"x":[15,26,330,41,1]};
name為s開頭的網紅。db.user.find({"name":/^s/})
結果如下,應該會尋找到steven、stanly。

fans中有包含m開頭的網紅。db.user.find({"fans": /^m/})
結果如下,應該會尋找到mark、steven、stanly三位。

本章說明了陣列欄位的搜尋方法,同時也簡單的說明正規表達式的搜尋,這些方法都很重要,
往後幾章時都還有可能繼續用到。
P.S 終於復活囉……