# 🏅 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)|