本篇文章將要說明其它幾個搜尋方法,包含如何搜尋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 終於復活囉……