# 🏅 Day 4 - MongoDB 基本操作:新增、查詢
MongoDB 是一個 NoSQL 資料庫(Not only SQL,針對不同於傳統的關聯式資料庫的資料庫管理系統的統稱),一套以文件(`document`)導向的資料庫管理系統,相較於傳統的關聯式資料庫,非關聯式資料庫的特性讓 MongoDB 在處理巨量資料有更大的支援。
MongoDB 會以 **BSON** 的形式儲存資料(Binary JSON),相較於 JSON 可以儲存的資料類型更多。
MongoDB 整體資料結構為:`db` → `collection` → `document`
我們可以透過指令(The `mongo` Shell)的方式用終端機來操作資料庫
### 新增
#### 新增單筆資料
`db.collection.insertOne()`
> `collection` 需替換為資料庫中 collection 的名稱,
> 例如:`db.orders.insertOne()`
```shell
db.orders.insertOne({ user: "user0" })
```
#### 新增多筆資料
`db.collection.insertMany([{},])`
```shell
db.orders.insertMany([{ user: "user0" }, { user: "user1" }, { user: "user2" }, ...])
```
> 執行新增成功後會為每一筆 document 都新增不同的 `_id`
例如執行新增多筆資料後會出現
> ```shell
> {
> "acknowledged" : true,
> "insertedIds" : [
> ObjectId("61ec1cf32fecb74092ce1463"),
> ObjectId("61ec1cf32fecb74092ce1464"),
> ObjectId("61ec1cf32fecb74092ce1465")
> ]
> }
> ```
### 查詢
`db.collection.find()`
直接執行此指令會將此 collection 中的資料全部列出
若是要查詢特定資料可以在 `find()` 帶入`{ 屬性: 值 }` 尋找符合條件的資料
例如:
```shell
db.orders.find({ user: "user0" })
```
屬性值可以搭配運算子設定條件:
使用**比較運算子**設定篩選條件
| $eq | 等於 |
| ---- | ------------ |
| $ne | 不等於 |
| $gt | 大於 |
| $lt | 小於 |
| $gte | 大於等於 |
| $lte | 小於等於 |
| $in | 存在某個值 |
| $nin | 不存在某個值 |
例如:
找出此 colletion 中符合 `price` 屬性值大於等於 `5000` 的資料
```shell
db.orders.find({ price: { $gte: 5000 } })
```
使用**邏輯運算子**
| $and | 全部條件皆符合 |
| ---- | ----------- |
| $or | 符合其中一項條件|
| $nor | 全部條件皆不符合|
| $not | 與條件相反 |
例如:
找出此 collection 中符合以下條件之一的資料:`isPaid` 屬性值為 `true`,或 `price` 值小於 `1500`
```shell
db.orders.find({ $or: [{ isPaid: true }, { price: { $lt: 1500 } }] })
```
也可以帶入**正規表達式**篩選有符合的文字
例如:查詢 `orders` 有包含 `user` 的資料
```shell
db.orders.find({ user: /user/ })
```
### 參考資源
- [insertOne()]( https://docs.mongodb.com/v4.4/reference/method/db.collection.insertOne/#db.collection.insertone--)
- [insertMany()](https://docs.mongodb.com/v4.4/reference/method/db.collection.insertMany/#db.collection.insertmany--)
- [db.collection.find()](https://www.mongodb.com/docs/v4.4/reference/method/db.collection.find/#db.collection.find--)
- [Query and Projection Operators — MongoDB Manual](https://www.mongodb.com/docs/v4.4/reference/operator/query/#comparison)
- 課程影音「MongoDB Shell 語法教學」
題目
---
建立一個「hexHotel」database,並在其中建立一個「orders」collection
依照下方題目敘述寫出相關操作指令
1. 依以下格式新增一筆資料到 `orders` collection
```json=
{
room: '豪華雙人房',
price: 3200,
user: 'Tom',
isPaid: true
}
```
2. 依以下格式一次新增多筆資料到 `orders` collection
```json=
{
room: '高級雙人房',
price: 2800,
user: 'Tom',
isPaid: true
},
{
room: '豪華三人房',
price: 3600,
user: 'Tom',
isPaid: true
},
{
room: '高級雙人房',
price: 2800,
user: 'Tommy',
isPaid: true
},
{
room: '尊爵景觀客房',
price: 4800,
user: 'Tony',
isPaid: false
}
```
3. 查詢 `orders` collection 中的所有資料
4. 查詢 `orders` collection 中 `room` 屬性為 `高級雙人房` 的資料
5. 查詢 `orders` collection 中 `price` 屬性低於 3000 `(< 3000)` 的資料
6. 查詢 `orders` collection 中 `price` 屬性高於 3000 `(> 3000)` 且還沒付款(`isPaid: false`)的資料
## 回報流程
將答案寫在 CodePen 並複製 CodePen 連結貼至底下回報就算完成了喔!
解答位置請參考下圖(需打開程式碼的部分觀看)
![](https://i.imgur.com/vftL5i0.png)
<!-- 解答:
1. db.ordeers.insertOne(
{
room: '豪華雙人房',
price: 3200,
user: 'Tom',
isPaid: true
}
)
2. db.ordeers.insertMany([
{
room: '高級雙人房',
price: 2800,
user: 'Tom',
isPaid: true
},
{
room: '豪華三人房',
price: 3600,
user: 'Tom',
isPaid: true
},
{
room: '高級雙人房',
price: 2800,
user: 'Tommy',
isPaid: true
},
{
room: '尊爵景觀客房',
price: 4800,
user: 'Tony',
isPaid: false
}
])
3. db.ordeers.find()
4. db.ordeers.find({ room: '高級雙人房' })
5. db.orders.find({
price: {
$lt: 3000
}
})
6. db.orders.find({
$and: [
{
price: {
$gt: 3000
}
},
{
isPaid: false
}
]
})
-->
回報區
---
<!--
將答案貼至下方表格內,格式:
| Discord 暱稱 | [CodePen](連結) |
-->
| Discord | CodePen / 答案 |
|:-------------:|:-----------------:|
| xxx | [CodePen]() |
| 2魚. | [CodePen](https://codepen.io/ijrekmsn-the-sans/pen/wvZPJYQ) |
| Jean | [CodePen](https://codepen.io/jeanchiang1221/pen/abxYeqP) |
| 群嘉 | [CodePen](https://codepen.io/efzdamnp-the-lessful/pen/zYXWgaM)|
| 羽 | [CodePen](https://codepen.io/lingling-Syu/pen/xxeWvQN?editors=0010)|
| 阿旭 | [CodePen](https://codepen.io/1997-work/pen/mdgLbqM)|
| Otis | [CodePen](https://codepen.io/humming74/pen/xxejKmE?editors=1011)|
| Aida | [CodePen](https://codepen.io/ada23410/pen/wvZjwbQ?editors=0010)|
| kelvinnn | [CodePen](https://codepen.io/is-lin/pen/WNWJNQB?editors=1010)|
| 苡安 | [CodePen](https://codepen.io/yi-an-yang/pen/YzMLzaO?editors=0010)|
| wei | [CodePen](https://codepen.io/Wei-the-sasster/pen/XWQqWGe?editors=0010)|
|cho|[CodePen](https://codepen.io/cho195/pen/LYvmEWa)|
|Tiya|[CodePen](https://codepen.io/Tiya_blank/pen/zYXjrNa)|
|ej_chuang|[CodePen](https://codepen.io/EJChuang/pen/ZEZoQgq)|
|Alan|[CodePen](https://codepen.io/l0f0/pen/QWPrNpB?editors=0010)|
|YJ|[CodePen](https://codepen.io/y0000ga/pen/KKYRzRJ)|
| Theodore | [CodePen](https://codepen.io/GustavoFringgg/pen/ZEZoOML) |
| yiling4054 | [CodePen](https://codepen.io/lin010/pen/bGJMeWy?editors=0011) |
| Chia Pin | [CodePen](https://codepen.io/joker-cat/pen/NWmMrzW) |
| tung030374 | [CodePen](https://codepen.io/tung__u/pen/OJGZbXj?editors=0010) |
| william_hsu | [CodePen](https://codepen.io/william8815/pen/ExJLNmY) |
| shuantt | [CodePen](https://codepen.io/th-tseng/pen/eYorBPO) |
| blp100x | [CodePen](https://codepen.io/blp100/pen/xxejdxo) |
| Tippy | [CodePen](https://codepen.io/Ektodor-Wang/pen/LYvmQPP) |
| Render Lai| [CodePen](https://codepen.io/hsinhui/pen/QWPrQbQ) |
| Lobinda| [CodePen](https://codepen.io/Lobinda/pen/vYMjpQE) |
| Wei | [mycompiler](https://www.mycompiler.io/view/2N0cXx0olDr) |
| zaoannihao | [CodePen](https://codepen.io/ckhwdvrx-the-solid/pen/vYMjaRa) |
| 圈圈 | [CodePen](https://codepen.io/wjejfczn-the-bold/pen/OJGZwKK) |
| Ciel | [CodePen](https://codepen.io/nycteachen/pen/QWPrZvr) |
| ellallu0903 | [CodePen](https://codepen.io/ellallu0903/pen/NWmzPgN) |
| Fabio | [CodePen]([連結](https://codepen.io/fabio7621/pen/GRLGgXJ?editors=0010)) |
| Hank | [CodePen](https://codepen.io/tw1720/pen/XWQYXMV) |
| runweiting | [CodePen](https://codepen.io/weiting14/pen/bGJKjYO) |
| Thomas | [CodePen](https://codepen.io/ThomasYeh/pen/rNbKoBj) |
| Johlmike | [CodePen](https://codepen.io/johlmike/pen/JjVZxdz) |
| william | [CodePen](https://codepen.io/snowman12320/pen/BaEPavv?editors=1010) |
| mei | [CodePen](https://codepen.io/l_umei/pen/yLrqbEE) |
| jenny7532 | [CodePen](https://codepen.io/wei-chen-wu/pen/zYXLmdm?editors=1112) |
| Henry | [CodePen](https://codepen.io/hekman1122/pen/vYMaqRJ?editors=0010) |
| Benson | [CodePen](https://codepen.io/nosneb83/pen/oNOPBeL) |
|瑀君 | [Codepen](https://codepen.io/yennnnn/pen/yLrxzmE)|
|jules | [Codepen](https://codepen.io/cjntfsoq-the-animator/pen/yLrxwLj?editors=1010)|
|yoshidc | [CodePen](https://codepen.io/yoshiyyc/pen/gOyBMaw)|
| albertyang3576 | [CodePen](https://codepen.io/albertyang3576/pen/VwNRPgR)|
| Sophiee | [CodePen](https://codepen.io/sophiee2727/pen/abxMGOa)|