iT邦幫忙

2022 iThome 鐵人賽

DAY 28
0
自我挑戰組

被MongoDB用Aggregate暴打的後端小菜雞日記系列 第 28

被MongoDB用bulkWrite暴打的後端小菜雞日記-day28-那些年被你遺漏的CRUD方法

  • 分享至 

  • xImage
  •  

花了六天講解Index之後,不曉得大家對建立索引是否有一些概念,至少知到如何建立索引吧?

至於索引的優化個人覺得需要一點時間,去觀察資料庫使用的狀況,如果發現有哪個collection的搜尋特別慢,代表可能需要加上索引,或是原本的索引已經不適合現在的搜尋方式,需要做修正。

今天是講解MongoDB技術文章的最後一天,輕鬆一點只介紹bulkWrite的用法,這個方法可以讓我們一次寫入多個不同的資料操作,操作的種類有以下這些。

  1. insertOne:新增一筆資料
  2. updateOne:更新一筆資料
  3. updateMany:更新多筆資料
  4. replaceOne:取代一筆資料
  5. deleteOne:刪除一筆資料
  6. deleteMany:刪除多筆資料

假設我們目前資料庫,有以下這些商品資料

  { name: "鍵盤", price: 3000, amount: 20, category: "3C" },
  { name: "小說", price: 240, amount: 120, category: "圖書" },
  { name: "帝王蟹", price: 4000, amount: 3, category: "食品" }

基本上bulkWrite寫法和aggregate很像,都是在陣列內寫入要執行的操作,而insertOne就和$match類似,代表要執行的操作,後面寫入要操作的資料。如果我們要新增一筆商品資料,可以這樣寫。

product.bulkWrite([
  {
    insertOne: {
      "document": {
        name: "小魚乾",
        price: 300,
        amount: 25,
        category: "食品"
      }
    }
  }
]);

// 執行結果會寫入一筆資料
{ _id: 4, name: "小魚乾",  price: 300,  amount: 25,  category: "食品" }

如果我們想要更新商品資料,可以使用updateOne,它只會更新符合filter條件的第一筆資料,但如果使用的是updateMany則是符合條件的所有資料,都會進行更新。

product.bulkWrite([
  {
    updateOne: {
      "filter": { category: "食品" }, // 尋找要更新資料的條件
      "update": { price: 3000 } // 寫入要更新的欄位
    }
  }
]);

// 被更新的資料
{ name: "帝王蟹", price: 3000, amount: 3, category: "食品" }

與updateOne不同的是,replaceOne會直接將整筆資料替換掉,所以要替換的資料一定要寫完整,如果像下面的範例只寫{ price: 3000 },會導致寫入不完整的資料,進入資料庫內。

product.bulkWrite([
  {
    replaceOne: {
      "filter": { name: "帝王蟹" },  // 設定要被取代的資料條件
      "replacement": { price: 3000 } // 取代的資料
    }
  }
]);

// 最後帝王蟹這筆資料會變成
{ _id: 3, price: 3000 }

replaceOne還可以透過設定upsert: true,當無法搜尋到符合條件的資料,並且取代,這時候會自動插入一筆資料進入collection,預設是upsert: false

product.bulkWrite([
  {
    replaceOne: {
      "filter": { category: "文具用品" },
      "replacement": {
        name: "鉛筆",
        price: 3000,
        amount: 30,
        category: "文具用品"
      },
      "upsert": true
    }
  }
]);

// 多新增一筆資料
{ _id: 5, name: "鉛筆", price: 3000, amount: 30, category: "文具用品" }

如果我們想要刪除資料可以使用deleteOne或deleteMany,差別一樣是deleteOne只會刪除符合filter條件的第一筆資料,而deleteMany則是刪除符合條件的所有資料。

product.bulkWrite([
  {
    deleteOne: {
      "filter": { name: "帝王蟹" } // 設定要刪除資料的條件
    }
  }
]);

如果對bulkWrite有興趣想要深入了解,可以參考官方文件

本篇文章同步放在我的部落格,大家有空可以進來逛逛


上一篇
被MongoDB用Index暴打的後端小菜雞日記-day27- Index Types
下一篇
被MongoDB用Aggregate暴打的後端小菜雞日記-day29番外篇-後端菜雞轉職記
系列文
被MongoDB用Aggregate暴打的後端小菜雞日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言