觀念解說 – MongoDB 基本操作: 修改、刪除
修改
修改單筆資料
updateOne() 第一個參數透過設定符合的屬性找出要修改的資料,若第一個參數帶入空物件 {},則會選取全部資料的第一筆資料,第二個參數放入要修改的屬性,需先加上 $set 物件,並在此物件中帶入要修改的物件屬性
第二個參數可選擇帶入 $currentDate 屬性,會再修改資料成功後顯示出最新修改的時間
1 2 3 4 5 6 7 8 9 10 11 12 13 | db.collection.updateOne( { example: "text" }, { $set: { example: "texttext" }, $currentDate: { lastModified: true } } ) |
修改多筆資料
1 2 3 4 5 6 7 8 9 10 11 12 13 | db.collection.updateMany( { example: /text/ }, { $set: { example: "texttext" }, $currentDate: { lastModified: true } } ) |
刪除
刪除一筆資料
只刪除一筆符合條件的資料
1 2 3 4 5 | db.collection.deleteOne( { example: /text/ } ) |
刪除多筆資料
1 2 3 4 5 | db.collection.deleteMany( { example: /text/ } ) |
刪除全部資料
1 | db.collection.deleteMany({}) |
參考資源
- db.collection.updateOne() — MongoDB Manual
- db.collection.updateMany() — MongoDB Manual
- db.collection.deleteOne() — MongoDB Manual
- db.collection.deleteMany() — MongoDB Manual
- 更新資料 – updateOne、updateMany(章節影片)
- 刪除資料 – deleteOne、deleteMany(章節影片)
- 尋找資料 – find 關鍵字搜尋(章節影片)
解題
題目(將答案寫在 HackMD 並提交至回報區)
若尚未做前一天的每日任務,需先建立一個 database(名稱可自定義),並建立一個 students collection
將以下資料新增至 students collection(若已做完前一天的每日任務,可繼續沿用已建立的 students collection
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | { "studentName": "Riley Parker", "group": "A", "score": 83, "isPaid": false }, { "studentName": "Brennan Miles", "group": "C", "score": 72, "isPaid": false }, { "studentName": "Mia Diaz", "group": "B", "score": 98, "isPaid": true }, { "studentName": "Caroline morris", "group": "B", "score": 55, "isPaid": false }, { "studentName": "Beverly Stewart", "group": "B", "score": 60, "isPaid": false } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | db.students.insertMany( [ { "studentName": "Riley Parker", "group": "A", "score": 83, "isPaid": false }, { "studentName": "Brennan Miles", "group": "C", "score": 72, "isPaid": false }, { "studentName": "Mia Diaz", "group": "B", "score": 98, "isPaid": true }, { "studentName": "Caroline morris", "group": "B", "score": 55, "isPaid": false }, { "studentName": "Beverly Stewart", "group": "B", "score": 60, "isPaid": false } ] ) |
insertMany() 方法加入多筆資料,第一個參數是用 [] 陣列下包多筆物件,一次建立多筆資料。
1 2 3 4 5 | 範例: 1. ... 2. ... 3. ... 4. ... |
指定其中一個 _id ,並將該筆 document 的 group 改為 D
使用 .findOne() 方法找到第一筆資料
1 | db.students.findOne({}) |
取到 _id 對象 ObjectId("6256fbabfddedd5ce0f03b89"),在查找一次確定取得正確。
1 | db.students.find({ '_id': ObjectId("6256fbabfddedd5ce0f03b89") }) |
執行後回傳內容如下,得到 "group" : "A"。
1 | { "_id" : ObjectId("6256fbabfddedd5ce0f03b89"), "studentName" : "Riley Parker", "group" : "A", "score" : 83, "isPaid" : false } |
group 改為 D
1 2 3 4 5 6 7 8 | db.students.updateOne( { '_id': ObjectId("6256fbabfddedd5ce0f03b89") }, { $set: { 'group': 'D' } } ) |
執行指令後回傳 { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 },在使用指令 db.students.find({ '_id': ObjectId("6256fbabfddedd5ce0f03b89") }) 查尋對象,回傳結果如下。
1 2 | db.students.find({ '_id': ObjectId("6256fbabfddedd5ce0f03b89") }) { "_id" : ObjectId("6256fbabfddedd5ce0f03b89"), "studentName" : "Riley Parker", "group" : "D", "score" : 83, "isPaid" : false } |
試著加入指令第二參數的部份,在多加上一個欄位屬性設定 $currentDate: { lastModified: true } 更動時加上時間,執行結果回傳 { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }。
1 2 3 4 5 6 7 8 9 10 11 | db.students.updateOne( { '_id': ObjectId("6256fbabfddedd5ce0f03b89") }, { $set: { 'group': 'D' }, $currentDate: { lastModified: true } } ) |
使用指令 db.students.find({ '_id': ObjectId("6256fbabfddedd5ce0f03b89") }) 查尋對象,回傳結果如下。
1 2 | db.students.find({ '_id': ObjectId("6256fbabfddedd5ce0f03b89") }) { "_id" : ObjectId("6256fbabfddedd5ce0f03b89"), "studentName" : "Riley Parker", "group" : "D", "score" : 83, "isPaid" : false, "lastModified" : ISODate("2022-04-13T16:48:40.279Z") } |
最後一個屬性欄位多加上 "lastModified" : ISODate("2022-04-13T16:48:40.279Z")。
將 group 為 B 的多筆 document 的 isPaid 改為 true
查尋對象 { 'group': 'B' }
1 2 3 | db.students.find( { 'group': 'B' } ) |
執行指令後回傳取得三筆資料。
1 2 3 | { "_id" : ObjectId("6256fbabfddedd5ce0f03b8b"), "studentName" : "Mia Diaz", "group" : "B", "score" : 98, "isPaid" : true } { "_id" : ObjectId("6256fbabfddedd5ce0f03b8c"), "studentName" : "Caroline morris", "group" : "B", "score" : 55, "isPaid" : false } { "_id" : ObjectId("6256fbabfddedd5ce0f03b8d"), "studentName" : "Beverly Stewart", "group" : "B", "score" : 60, "isPaid" : false } |
執行多筆資料更新,使用 .updateMany() 方法,第一個參數設定對象為 { 'group': 'B' },將資料以 $set 更動,將其中的欄位都更動為 'isPaid': true。
1 2 3 4 5 6 7 8 | db.students.updateMany( { 'group': 'B' }, { $set: { 'isPaid': true } } ) |
執行指令後回傳結果如下。
1 | { "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 2 } |
執行 db.students.find({ 'group': 'B' }) 指令查看更新過的資料,
1 2 3 4 5 6 7 8 9 10 11 | db.students.updateMany( { 'group': 'B' }, { $set: { 'isPaid': true }, $currentDate: { lastModified: true } } ) |
欄位上有在加上時間屬性欄位 "lastModified" : ISODate("xxxxxxxx",回傳結果如下。
1 2 3 | { "_id" : ObjectId("6256fbabfddedd5ce0f03b8b"), "studentName" : "Mia Diaz", "group" : "B", "score" : 98, "isPaid" : true, "lastModified" : ISODate("2022-04-13T17:00:10.005Z") } { "_id" : ObjectId("6256fbabfddedd5ce0f03b8c"), "studentName" : "Caroline morris", "group" : "B", "score" : 55, "isPaid" : true, "lastModified" : ISODate("2022-04-13T17:00:10.005Z") } { "_id" : ObjectId("6256fbabfddedd5ce0f03b8d"), "studentName" : "Beverly Stewart", "group" : "B", "score" : 60, "isPaid" : true, "lastModified" : ISODate("2022-04-13T17:00:10.005Z") } |
將 studentName 包含關鍵字 Brennan 的 document 刪除
會以模糊查找查字串 Brennan,會需要使用正則表達式用二個斜線 /<查尋字串>/ 包查找的字串尋找 ( /Brennan/)。
使用完整字串是找不到相關資料,輸入指令會跳到下一行。
1 2 3 | db.students.find({ 'studentName': 'Brennan' }) |
執行後回傳結果,正確取得其中有 Brennan 的資料。
1 | { "_id" : ObjectId("6256fbabfddedd5ce0f03b8a"), "studentName" : "Brennan Miles", "group" : "C", "score" : 72, "isPaid" : false } |
接著使用刪除指令進行刪除,因為一筆可使用 .deleteOne() 刪單筆,也可用 .deleteMany() 刪多筆,這裡使用刪除多筆的方式進行。
1 2 3 4 5 | db.students.deleteMany( { 'studentName': /Brennan/ } ) |
執行後回傳訊息
1 | { "acknowledged" : true, "deletedCount" : 1 } |
在使用下面指令查找資料,執行後沒有回傳訊息直接跳到下一行。,指令如下
1 2 3 4 5 | db.students.find( { 'studentName': /Brennan/ } ) |
將 isPaid 為 true 的多筆 document 刪除
1 2 3 4 5 | db.students.find( { 'isPaid': true } ) |
指令執行結果回傳如下,取到三筆資料。
1 2 3 | { "_id" : ObjectId("6256fbabfddedd5ce0f03b8b"), "studentName" : "Mia Diaz", "group" : "B", "score" : 98, "isPaid" : true, "lastModified" : ISODate("2022-04-13T17:00:10.005Z") } { "_id" : ObjectId("6256fbabfddedd5ce0f03b8c"), "studentName" : "Caroline morris", "group" : "B", "score" : 55, "isPaid" : true, "lastModified" : ISODate("2022-04-13T17:00:10.005Z") } { "_id" : ObjectId("6256fbabfddedd5ce0f03b8d"), "studentName" : "Beverly Stewart", "group" : "B", "score" : 60, "isPaid" : true, "lastModified" : ISODate("2022-04-13T17:00:10.005Z") } |
接著進行刪除多筆資料,使用 .deleteMany() 方法,指令如下
1 2 3 4 5 | db.students.deleteMany( { 'isPaid': true } ) |
指令執行後回傳如下。
1 | { "acknowledged" : true, "deletedCount" : 3 } |
查尋 'isPaid': true 對象,執行指令後直接跳到下一行。
1 2 3 4 5 | db.students.find( { 'isPaid': true } ) |