iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 8
2
Big Data

30天之你好MongoDB系列 第 8

30-8之新手村CRUD---搜尋之find與搜尋操作符號

黑色好看版 - 傳送門


前面幾篇已經說明完了新增、修改、刪除,最後咱們新手村之旅的尾巴將要說明搜尋,這個功能應該是我們最常會使用到的,請好好的學習。

  • find方法基本說明
  • find的搜尋條件(含搜尋故事)

P.S +u^8~

find方法基本說明


mongodb使用find來進行搜尋,它的第一個參數決定要那些資料,而第二個參數則決定要返回那些key

基本的使用範例如下,首先我們先建立一些資料。

db.user.insert({"name":"mark","id":"1","age":20});
db.user.insert({"name":"steven","id":"2","age":20});
db.user.insert({"name":"jj","id":"3","age":25});
db.user.insert({"name":"bb","id":"4","age":20});

我們想尋找到namemarkdocument,並且我們希望回傳值只回傳id這個key就好,搜尋指令如下。

db.user.find({"name":"mark"},{"id" :1 })

搜尋結果如下,它只回傳了key id的內容,但是可以看到_id也被回傳回來,因為在默認情況下_id這個key會自動被傳回來,如果真的不想它也回傳回來可以下達下列搜尋指令。

db.user.find({"name":"mark"},{"id" : 1,"_id":0})

~ find的搜尋條件 ~


這邊我們將要說明find常用搜尋條件,and、or、大於等於、大於、小於、小於等於、包含、不包含,有了這些條件我們就可以更方便的尋找你所需要的document

這邊簡單的整理成一張表來對應操作符號。

條件 操作符號
AND $and,另一種方法也可以直接在query中下{"key1","value1","key2":"value2"}
OR $or
NOT $not
NOR $nor
大於 $gt
大於等於 $gte
小於 $lt
小於等於 $lte
包含 $in
不包含 $nin

我們接下來會先產生幾筆測試資料,再來測試幾個搜尋故事。

測試資料如下,這是一組使用者資訊,裡面記載了使用者的名稱、年紀、粉絲數以及喜歡數。

//collection為user

{"id":"1","name":"mark","age":25,"fans":100,"likes" : 1000}
{"id":"2","name":"steven","age":35,"fans":220,"likes" : 50}
{"id":"3","name":"stanly","age":30,"fans":120,"likes" : 33}
{"id":"4","name":"max","age":60,"fans":500,"likes" : 1000}
{"id":"5","name":"jack","age":30,"fans":130,"likes" : 1300}
{"id":"6","name":"crisis","age":30,"fans":130,"likes" : 100}
{"id":"7","name":"landry","age":25,"fans":130,"likes" : 100}

我想要尋找年紀30歲以上(包含30),但不滿60歲(不包含60),fans又有200人以上(包含200)的人

這時就需要$gte$ltand一起用囉,這有兩種寫法。

//這是第一種
db.user.find(
	{"age":{"$gte":30,"$lt":60},
	 "fans":{"$gte" : 200}})
	 
//這是第二種
db.user.find(
	{"$and":[{"age":{"$gte":30,"$lt":60}},{"fans":{"$gte" : 200}}]})

結果如下,應該只找到steven這位仁兄。

我想要尋找fans小於等於100,或是likes小於100的人。

這時就需要用到or$lt$lte囉。

db.user.find(
	{"$or": [{"fans":{"$lte":100}},{"likes":{"$lt":100}}]})

結果如下,應該是找到三位mark、steven、stanly

我想要尋找age25、60的人。

這時可用$in

db.user.find({"age":{"$in":[25,60]}})

結果如下,應該是找到三位mark、max、landry

我想要尋找age不為25、60的人,並且只給我它的id就好。

這時可用$nin

db.user.find({"age":{"$nin":[25,60]}},{"id":1})

結果如下~應該是會找到4位。

我想要尋找likes小於等於100的人(使用$not)

這邊事實上可以很簡單的用$lte,但因為我們要介紹一下$not所以會寫的比較麻煩點兒,
而真正可以發揮$not功能時,是在和正規表達式聯合使用時,用來查找不匹配的document

來解釋一下這段,首先它會尋找所有likes大於100document,但這時在配個$not就變成完全相反會變成小於等於喔。

db.user.find({"likes":{"$not":{"$gt":100}}})

所以結果應該是找到4筆。

我們想要找同時不滿足fans大於100人且likes大於500。

這邊我們可以用$nor來尋找,它的意思就是選出所有不滿足條件的document

db.user.find({"$nor":[{"fans":{"$lt":100}},{"likes":{"$lt":100}}]})

~ 結語 ~


今天說明了很多的條件符號,可以簡單分成以以下兩類,邏輯符號與比較符號,運用這兩種符號就可以針對很多種情況下進行搜尋,當然還不只這些,明天將會繼續,我累了……。

操作符號
邏輯符號 $and$or$ornot
邏輯符號用法 {$xxx: [ { expression1 },{ expression2 }]} { field: { $not: { <operator-expression> } } }
比較符號 $gt$gte$lt$lte$in``$nin
比較符號用法 {field: {$gt: value} } { field: { $in($nin): [<value1>, <value2>, ... <valueN> ] } }

~ 參考資料 ~



上一篇
30-7之新手村CRUD---刪除
下一篇
30-9之新手村CRUD---搜尋之陣列欄位與regex
系列文
30天之你好MongoDB30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
WeiYuan
iT邦新手 4 級 ‧ 2016-12-08 21:51:45

覺得後面的小小兵很搶鏡頭(誤

馬克 iT邦研究生 3 級 ‧ 2016-12-08 21:55:03 檢舉

這是在辛苦的鐵人日子中的心裡安慰/images/emoticon/emoticon02.gif

/images/emoticon/emoticon37.gif

我要留言

立即登入留言