2021 iThome 鐵人賽 - DAY9 MongoDB 文件與嵌入式(巢狀)文件查詢(Find)

2021 iThome 鐵人賽 MongoDB披荊斬棘之路


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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
db.movie.insertMany([
{
name: 'movie1',
publishYear: 2020,
producer: {
company: "Disnai",
registrant: "Water Disnai"
}
},
{
name: 'movie2',
publishYear: 2019,
producer: {
company: "Larvem",
registrant: "Natt Marvel"
}
}
])

假設我們要查公司是 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
2
3
4
5
db.testNull.insertMany([
{'field': 1},
{'field': 2},
{'field': null},
])

alt

查詢語法比想像中簡單,就是 field:null

1
2
3
film> db.testNull.find({ field:null })
[ { _id: ObjectId("6136337d924cfb987f3ce27c"), field: null } ]
film>

欄位類型判斷

打鐵趁熱,我們也趕緊看看如何判斷欄位的類型,某些情況會有不確定性,就需要單獨查詢這個欄位是什麼類型。

使用的 operator 為 $type

1
2
film> db.testNull.find({ field : { $type: 10 } })
[ { _id: ObjectId("6136337d924cfb987f3ce27c"), field: null } ]

為什麼是 10 呢?這就要回到剛開始介紹的 BSON type 類型,這邊直接提供官網 供各位參考,其中 Number 欄位就是這裡的數字。