iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 11
0
AI & Data

從入門到精通 MongoDB系列 第 11

Day11: 進階的 CRUD 操作(1) - insert() 與 insertMany()

前面兩篇介紹了 MongoDB 中的兩種關係:一對一關係及一對多關係,今天要來跟大家介紹第3種關係:多對多關係


為什麼不使用 insert()?

我們在「Day04: MongoDB 的 CRUD(2) - Insert & Delete」文章中介紹到可以使用 insertOne()insertMany() 來新增單筆或多筆資料。

  • insertOne():db.test.insertOne({A:1, B:2})

  • insertMany():db.test.insertMany([{A:3, B:4}, {A:5, B:6}])

我們可以發現不管是用 insertOne() 還是 insertMany(),都是回傳一個 JSON 結構,因此我們可以用變數去儲存這些資訊:var a = db.test.insertMany([{A:3, B:4}, {A:5, B:6}])
接著,就可以取得 insertIds 的資訊:

而為什麼我們不建議使用另一種新增資料的方法:insert() 呢?因為當我們使用 insert() 來新增資料,回傳值不會有 insertedIds 的資訊,需要再透過 find() 才能取得。

使用 insert() 新增一筆資料

  • db.test.insert({A:10, B:20})
    • 執行指令後的回傳結果只有:nInserted
  • db.test.find()
    • 需要使用 find() 才能得知 insertedIds

使用 insert() 新增多筆資料

  • db.test.insert([{A:30,B:40}, {A:50,B:60}])

    • 執行指令後的回傳一樣沒有 insertedIds
  • db.test.find()

    • 需要使用 find() 才能得知 insertedIds

insertMany() 是否按順序新增對結果的影響

我們透過以下步驟來觀察 insertMany() 是否按順序新增對結果的影響為何。

  1. 先新增一個 document:db.test.insertOne({_id:1, A:1, B:2})

  2. 再新增多個 document,但 _id 有重複:db.test.insertMany([{_id:2, A:10},{_id:1, A:20},{_id:3, A:30}])

  3. 執行步驟 2 時會報錯 "writeErrors"

  4. 但透過 find() 查看會發現:_id:2 的已成功新增

    • 因為 insertMany() 預設是按照順序插入
      1. "_id":2 先新增成功
      2. "_id":1 "writeErrors" 錯誤退出
      3. "_id":3 沒有執行到
  5. 使用 ordered 讓 insertMany() 不依順序去執行,會嘗試完所有新增:db.test.insertMany([{_id:2, A:10},{_id:1, A:20},{_id:3, A:30}], {ordered:false})

    • 仍會報錯 “writeErrors"
    • 但只有重複的 _id 沒有成功新增,其餘都有執行且成功新增

上述方法不建議使用,但為了防止 _id 重複,我們在新增資料時不指定 _id,而是讓系統自行產生。


今天開始會跟大家探討 mongoDB 中更深入的 CRUD 操作,今天介紹了不建議使用 insert() 的原因以及 insertMany() 時要注意的問題。下一篇會介紹如何直接將 JSON 檔案導入資料庫中進行操作。


上一篇
Day10: NoSQL 中的關係(3) - 多對多關係
下一篇
Day12: 進階的 CRUD 操作(2) - 如何透過 JSON 文件導入資料
系列文
從入門到精通 MongoDB26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言