iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 9
1
Big Data

30天之你好MongoDB系列 第 9

30-9之新手村CRUD---搜尋之陣列欄位與regex

  • 分享至 

  • xImage
  •  

黑色好看版 - 傳送門


本篇文章將要說明其它幾個搜尋方法,包含如何搜尋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中同時有stevenmax的網紅

我們這時就可以使用$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]};

我們想要尋找names開頭的網紅。

db.user.find({"name":/^s/})

結果如下,應該會尋找到steven、stanly

我們想要尋找fans中有包含m開頭的網紅。

db.user.find({"fans": /^m/})

結果如下,應該會尋找到mark、steven、stanly三位。

~ 結語 ~


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

P.S 終於復活囉……

~ 參考資料 ~



上一篇
30-8之新手村CRUD---搜尋之find與搜尋操作符號
下一篇
30-10之新手村CRUD---搜尋之Cursor運用與搜尋原理
系列文
30天之你好MongoDB30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言