iT邦幫忙

2021 iThome 鐵人賽

DAY 9
1
Software Development

MongoDB披荊斬棘之路系列 第 9

DAY9 MongoDB 文件與嵌入式(巢狀)文件查詢(Find)

  • 分享至 

  • xImage
  •  

DAY9 MongoDB 文件與嵌入式(巢狀)文件查詢(Find)

Find

把 MongoDB 的查詢放在最後面,其實你也已經學完了,但我還是快速帶過基本的範例。

  • 查詢 field == TargetString 的文件
db.collection.find({"field": "TargetString"})
  • 查詢 field == str1 OR field == str2 的文件
db.collection.find({"field": { $in: ["str1", "str2"] }})
  • 查詢 5 <= field < 8 的文件
db.collection.find({"field": { $gte: 5, $lt: 8 }})
  • 查詢 field < 5 OR field >= 7 的文件
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 就像這樣:

db.collection.find({}, { field_a:1, field_b:0 })

再提醒的是 _id 預設就是會被查詢出來,如果也不想要的話,需要特別指定該欄位為 0


Embedded Document 查詢

Embedded document 查詢其實也非常的簡單,一個 . 就能講完。

首先我們準備一個範例:

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 欄位即可。

db.movie.find({ 'producer.company': 'Disnai' })

這邊跟之前的 collection 略微不同,需要使用單引號''或雙引號"" 將整個欄位包住。

  • 那如果是三層的 embedded document 呢?

方法還是一樣。

db.movie.find({ 'level1.level2.level3': 'Gotcha' })

欄位是否存在查詢

實際的使用情境上,我們很常會需要確認某個欄位是否存在,這時候要如何下查詢語法?

要使用的 operator 是 $exists,直接上範例!

db.movie.find({ NotExistField: { $exists: true }})

這個範例就是查詢存在這個欄NotExistField的文件,結果當然是沒有任何文件有此欄位。若 exists 設定為 false,那每一筆資料都符合、會被查出來了喔。

Null 欄位的查詢

Null 是 Bson 支援的型態之一,不是沒有此欄位,是此欄位是 null。那麼我們要如何查詢 null 欄位呢?

首先先來準備三筆資料

db.testNull.insertMany([
    {'field': 1},
    {'field': 2},
    {'field': null},
])

https://ithelp.ithome.com.tw/upload/images/20210909/20140504OIrTbmQk1r.png

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

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

欄位類型判斷

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

使用的 operator 為 $type

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

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


MongoDB 比較基礎的部分在前幾天總算結束了,後面的內容會稍微深入且份量比較重喔~


本系列文章會同步發表於我個人的部落格 Pie Note


上一篇
DAY8 MongoDB 批次操作(bulk wirte) 與 Operators
下一篇
DAY10 MongoDB 聚合(Aggregate)種類介紹
系列文
MongoDB披荊斬棘之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言