DAY9 MongoDB 文件与嵌入式(巢状)文件查询(Find)

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


<<:  9.移转 Aras PLM大小事-BOM的差异

>>:  [Day8]PHP判断式01

初学者跪着学JavaScript Day20 : 原型毕露(中)

一日客语:中文:青色 客语:抢厶ㄟ ˋ 继续学习原型吧~ 学习内容: 1.Object.getPro...

2.4.8 Design System - Icon

因为疫情的关系 体会到很多事情都要持之以恒 在突然被打乱的生活节奏中 要怎麽找回另一个习惯的步调 ...

[重构倒数第09天] - Vue-Cli + PurgeCSS 删除你用不到的CSS

前言 该系列是为了让看过Vue官方文件或学过Vue但是却不知道怎麽下手去重构现在有的网站而去规画的系...

[Day22] 挖出心理话的提问技巧

在推动团队开发系统的改善过程中,曾经遇到一个难题: 要如何将合作的流畅度、资讯的透明度以及团队成员的...

【踩坑】animation 选单按钮动起来(实作篇)

前情提要 昨天好好的复习了一下动画的特性之後 今天就来看看怎麽做这颗按钮吧! 图源:https://...