DAY9 MongoDB 文件與嵌入式(巢狀)文件查詢(Find)
Find
把 MongoDB 的查詢放在最後面,其實你也已經學完了,但我還是快速帶過基本的範例。
- 查詢
field == TargetString
的文件
1 | db.collection.find({"field": "TargetString"}) |
- 查詢
field == str1 OR field == str2
的文件
1 | db.collection.find({"field": { $in: ["str1", "str2"] }}) |
- 查詢
5 <= field < 8
的文件
1 | db.collection.find({"field": { $gte: 5, $lt: 8 }}) |
- 查詢
field < 5 OR field >= 7
的文件
1 | db.collection.find({ $or:[{ "field": {$lt:5}}, {"field": {$gte:7}} ]})}}) |
Find Pattern
還是要來一下 MongoDB Find Pattern
db.collection.find(query, projection)
上面的範例都還是 query 的範疇,也代表 projection 是可以省略的。
Projection 本身就像是要查詢的欄位一樣:
1
代表 true,查詢0
代表 false,呼略此欄位
因此想查出 field_a
,但不要 field_b
就像這樣:
1 | db.collection.find({}, { field_a:1, field_b:0 }) |
再提醒的是 _id
預設就是會被查詢出來,如果也不想要的話,需要特別指定該欄位為 0
Embedded Document 查詢
Embedded document 查詢其實也非常的簡單,一個 .
就能講完。
首先我們準備一個範例:
1 | db.movie.insertMany([ |
假設我們要查公司是 Disnai 的電影只需要使用 .
連接 nested document 欄位即可。
1 | db.movie.find({ 'producer.company': 'Disnai' }) |
這邊跟之前的 collection 略微不同,需要使用單引號''
或雙引號""
將整個欄位包住。
- 那如果是三層的 embedded document 呢?
方法還是一樣。
1 | db.movie.find({ 'level1.level2.level3': 'Gotcha' }) |
欄位是否存在查詢
實際的使用情境上,我們很常會需要確認某個欄位是否存在,這時候要如何下查詢語法?
要使用的 operator 是 $exists
,直接上範例!
1 | db.movie.find({ NotExistField: { $exists: true }}) |
這個範例就是查詢存在這個欄NotExistField
的文件,結果當然是沒有任何文件有此欄位。若 exists 設定為 false,那每一筆資料都符合、會被查出來了喔。
Null 欄位的查詢
Null 是 Bson 支援的型態之一,不是沒有此欄位,是此欄位是 null。那麼我們要如何查詢 null
欄位呢?
首先先來準備三筆資料
1 | db.testNull.insertMany([ |
查詢語法比想像中簡單,就是 field:null
1 | film> db.testNull.find({ field:null }) |
欄位類型判斷
打鐵趁熱,我們也趕緊看看如何判斷欄位的類型,某些情況會有不確定性,就需要單獨查詢這個欄位是什麼類型。
使用的 operator 為 $type
。
1 | film> db.testNull.find({ field : { $type: 10 } }) |
為什麼是 10
呢?這就要回到剛開始介紹的 BSON type 類型,這邊直接提供官網 供各位參考,其中 Number
欄位就是這裡的數字。