MongoDB 作為廣泛應用的 NoSQL 資料函式庫,其檔案更新、刪除和索引操作對於資料管理至關重要。本文將解析 update()updateOne()updateMany() 以及 remove()deleteOne()deleteMany() 等方法,並探討 upsertmulti 等選項的應用場景。同時,文章還會深入講解 MongoDB 的索引型別,包括單欄位索引、複合索引、多鍵索引等,以及如何建立、使用和管理索引,以提升查詢效能。此外,文章也涵蓋了 MongoDB 的原子性、一致性等進階概念,並闡述索引的限制和最佳實務,幫助讀者更有效地運用 MongoDB。

MongoDB 檔案更新與刪除操作詳解

在 MongoDB 中,更新和刪除檔案是資料函式庫操作中的重要環節。本文將探討 MongoDB 中的更新和刪除方法,包括 update()updateOne()updateMany()remove()deleteOne()deleteMany() 等。

更新檔案

MongoDB 提供了多種方法來更新檔案,包括 update()updateOne()updateMany()

使用 update() 方法更新檔案

update() 方法可用於更新單一或多個檔案,取決於 multi 選項的設定。

var BPBBooksSelectionQuery = {
  'Year': '2019'
};
var BPBBooksDatatoUpdate = {
  'Publisher': 'BPB Publications'
};

db.BPBOnlineBooksCollection.update(BPBBooksSelectionQuery, {
  $set: BPBBooksDatatoUpdate
}, {
  multi: true
});

使用 updateOne() 方法更新單一檔案

updateOne() 方法用於更新符合篩選條件的第一個檔案。

var BPBBooksSelectionQuery = {
  'Title': 'IOT and Smart Cities: Your Smart City Planning Guide'
};
var BPBBooksDatatoUpdate = {
  'Title': 'IOT and Smart Cities',
  'Year': '2020'
};

db.BPBOnlineBooksCollection.updateOne(BPBBooksSelectionQuery, {
  $set: BPBBooksDatatoUpdate
});

使用 updateMany() 方法更新多個檔案

updateMany() 方法用於更新符合篩選條件的多個檔案。

var BPBBooksSelectionQuery = {
  'Year': '2019'
};
var BPBBooksDatatoUpdate = {
  'Discount': '10%'
};

db.BPBOnlineBooksCollection.updateMany(BPBBooksSelectionQuery, {
  $set: BPBBooksDatatoUpdate
});

upsert 選項

upsert 選項預設為 false。當設定為 true 時,如果沒有符合篩選條件的檔案,將會插入一個新檔案。

multi 選項

multi 選項預設為 false,僅適用於 update() 方法。當設定為 true 時,將會更新多個符合篩選條件的檔案。

刪除檔案

MongoDB 提供了多種方法來刪除檔案,包括 remove()deleteOne()deleteMany()

使用 remove() 方法刪除檔案

remove() 方法可用於刪除單一或多個檔案,取決於 justOne 選項的設定。然而,該方法已被棄用,建議使用 deleteOne()deleteMany() 方法。

var BPBBooksSelectionQuery = {
  'Year': '2002'
};

db.BPBOnlineBooksCollection.remove(BPBBooksSelectionQuery, {
  justOne: true
});

justOne 選項

justOne 選項預設為 false。當設定為 true 時,將只刪除第一個符合篩選條件的檔案。

重點整理

  • MongoDB 提供多種方法來更新和刪除檔案。
  • update()updateOne()updateMany() 用於更新檔案。
  • remove()deleteOne()deleteMany() 用於刪除檔案。
  • 瞭解 upsertmultijustOne 等選項的設定和使用,有助於更靈活地操作資料。

圖表說明

此圖示展示了 MongoDB 更新和刪除操作的流程和相關方法。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title MongoDB 檔案更新刪除與索引操作詳解

package "資料庫架構" {
    package "應用層" {
        component [連線池] as pool
        component [ORM 框架] as orm
    }

    package "資料庫引擎" {
        component [查詢解析器] as parser
        component [優化器] as optimizer
        component [執行引擎] as executor
    }

    package "儲存層" {
        database [主資料庫] as master
        database [讀取副本] as replica
        database [快取層] as cache
    }
}

pool --> orm : 管理連線
orm --> parser : SQL 查詢
parser --> optimizer : 解析樹
optimizer --> executor : 執行計畫
executor --> master : 寫入操作
executor --> replica : 讀取操作
cache --> executor : 快取命中

master --> replica : 資料同步

note right of cache
  Redis/Memcached
  減少資料庫負載
end note

@enduml

圖表內容解密:

  • 此圖表呈現了 MongoDB 中更新和刪除操作的分類別和方法選擇。
  • 更新操作包括 update()updateOne()updateMany() 三種方法,分別用於不同場景下的檔案更新。
  • 刪除操作包括 remove()deleteOne()deleteMany() 三種方法,其中 remove() 已被棄用,建議使用後兩者。
  • 圖表結構清晰地展示了 MongoDB 在資料操作上的功能豐富性和靈活性。

MongoDB CRUD 操作深入解析

MongoDB 提供了多種方法來執行 CRUD(建立、讀取、更新、刪除)操作。這些操作對於資料函式庫的管理和維護至關重要。在本章中,我們將探討 MongoDB 的 CRUD 操作,並學習如何使用不同的 MongoDB 方法來執行這些操作。

刪除檔案

MongoDB 提供了多種方法來刪除檔案,包括 remove()deleteOne()deleteMany()

使用 remove() 方法刪除多個檔案

remove() 方法用於刪除 MongoDB 集合中的檔案。該方法可以根據指定的查詢條件刪除一個或多個檔案。

var BPBBooksSelectionQuery = { 'Year': '2020' };
db.BPBOnlineBooksCollection.remove(BPBBooksSelectionQuery);

使用 deleteOne() 方法刪除單個檔案

deleteOne() 方法用於刪除 MongoDB 集合中的單個檔案。該方法根據指定的查詢條件刪除第一個匹配的檔案。

var BPBBooksSelectionQuery = { 'Year': '2020' };
db.BPBOnlineBooksCollection.deleteOne(BPBBooksSelectionQuery);

使用 deleteMany() 方法刪除多個檔案

deleteMany() 方法用於刪除 MongoDB 集合中的多個檔案。該方法根據指定的查詢條件刪除所有匹配的檔案。

var BPBBooksSelectionQuery = { 'Year': '2019' };
db.BPBOnlineBooksCollection.deleteMany(BPBBooksSelectionQuery);

內容解密:

  • remove() 方法:可用於刪除單個或多個檔案,但官方已建議使用 deleteOne()deleteMany() 取代。
  • deleteOne() 方法:刪除第一個匹配的檔案。
  • deleteMany() 方法:刪除所有匹配的檔案。

MongoDB 批次寫入操作

MongoDB 提供了 bulkWrite() 方法來執行批次寫入操作,包括插入、更新和刪除。

bulkWrite() 方法定義

db.collection.bulkWrite(
  [<operation 1>, <operation 2>, ... <operation N>],
  { ordered: <boolean> }
)

支援的寫入操作

  • insertOne
  • updateOne
  • updateMany
  • replaceOne
  • deleteOne
  • deleteMany

範例:使用 bulkWrite() 方法執行批次寫入操作

db.BPBOnlineBooksCollection.bulkWrite([
  { insertOne: { "document": { "_id": 4, "Title": "Learn C++", "Year": "2000", "Price": 450 } } },
  { insertOne: { "document": { "_id": 5, "Title": "Mastering Java", "Year": "2005", "Price": 700 } } },
  { updateOne: { "filter": { "Title": "Learn C++" }, "update": { $set: { "Publisher": "BPB Publication" } } } },
  { deleteOne: { "filter": { "Year": "2010" } } },
  { replaceOne: { "filter": { "Title": "Introduction to Python" }, "replacement": { "Title": "Mastering Python", "Year": "2020", "Price": 800 } } }
]);

內容解密:

  • bulkWrite() 方法:用於執行多個寫入操作,包括插入、更新和刪除。
  • ordered 引數:控制批次寫入操作的執行順序。若設為 true,則遇到錯誤時會停止執行後續操作;若設為 false,則會繼續執行後續操作。

問題與討論

  1. 給出兩個在 MongoDB 中使用的建立檔案方法的範例。
  2. 什麼是 multi 選項?如何使用它?給出範例。
  3. 給出兩個在 MongoDB 中使用的更新檔案方法的範例。
  4. 說明欄位更新運算元的用途及其應用場景。
  5. 給出在 MongoDB 中執行批次寫入操作的範例。

本章重點:

  • MongoDB CRUD 操作的基本概念
  • 使用不同方法執行 CRUD 操作
  • bulkWrite() 方法的應用
  • 欄位更新運算元的使用

本章內容全面介紹了 MongoDB 的 CRUD 操作和批次寫入操作,為讀者提供了深入的理解和實務操作的基礎。接下來的章節將繼續探討 MongoDB 的進階主題,包括原子性、一致性、分散式操作、查詢計劃和效能分析等。

MongoDB 中階概念解析

原子性(Atomicity)解析

在探討 MongoDB 的原子性之前,我們先來瞭解什麼是資料函式倉管理系統中的原子性。原子性是指在資料函式庫交易中,所有操作要麼全部成功,要麼全部失敗,不會出現部分成功、部分失敗的情況。這確保了資料函式庫的完整性。

MongoDB 中的原子性

MongoDB 支援單一檔案級別的原子性。也就是說,當更新一個包含數百個欄位的檔案時,要麼所有欄位都被更新,要麼都不更新。這確保了單一檔案的資料一致性。

db.collection.updateOne(
    { _id: "documentId" },
    { $set: { field1: "value1", field2: "value2" } }
)

內容解密:

  • updateOne 方法用於更新單一檔案。
  • $set 運算子用於設定欄位的值。
  • 這種操作是原子性的,確保要麼所有指定的欄位都被更新,要麼都不更新。

多檔案交易與原子性

MongoDB 不支援多檔案交易的原子性。例如,使用 updateMany 方法更新多個檔案時,每個檔案的更新是原子性的,但整體操作不是。

db.collection.updateMany(
    { condition: "value" },
    { $set: { field: "newValue" } }
)

內容解密:

  • updateMany 方法用於更新多個符合條件的檔案。
  • 每個檔案的更新是原子性的,但如果操作中途失敗,已更新的檔案不會回復。

一致性(Consistency)解析

一致性是指資料函式庫在交易過程中保持一致狀態的特性。無論交易是否成功,資料函式庫都不會處於不一致的狀態。

MongoDB 中的一致性

MongoDB 預設支援一致性。在複本集(Replica Set)中,主節點(Primary)的一致性是保證的。從節點(Secondary)預設為最終一致性。

最終一致性

最終一致性模型保證,如果沒有新的更新,所有的存取都會傳回最後的更新值。

複製(Replication)簡介

複製是指在多台伺服器上維護相同資料集的過程,以確保資料的冗餘和高用性。

複本集(Replica Sets)

複本集是一組維護相同資料集的 MongoDB 例項。它們提供容錯移轉和提高讀取效能的能力。

分片(Sharding)簡介

分片是指將大規模資料分佈到多台機器上的過程,以提高資料處理能力和儲存容量。

為什麼需要分片?

當資料量過大,單一機器無法負載時,分片可以將資料分佈到多台機器上,提高整體效能。

MongoDB 索引介紹

在前一章中,我們討論了中階主題,如 MongoDB 中的原子性和一致性。我們也介紹了複製和分片的基本概念及其用途。本章將探討索引的概念。在本章中,我們將從索引的介紹及其好處開始,學習索引是一種特殊的資料結構,能夠以易於遍歷的形式儲存資料。我們還將介紹 MongoDB 預設的 _id 索引,並瞭解其屬性。接著,我們將學習如何在 MongoDB 中建立索引。稍後在本章中,我們將研究可以在 MongoDB 中建立的不同型別的索引,並提供逐步的實際範例。我們還將研究在 MongoDB 中建立索引時可以使用的一些不同索引屬性。我們還將瞭解如何將索引與其他 MongoDB 方法結合使用。最後,我們將介紹如何在 MongoDB 中檢視現有的索引以及如何刪除現有的索引。此外,我們還將瞭解 MongoDB 索引中的一些限制。

本章結構

在本章中,我們將討論以下主題:

  • 索引是什麼?
  • 預設 _id 索引
  • 建立索引
  • MongoDB 中的索引型別
  • 索引屬性

索引是什麼?

在資料函式倉管理系統中,索引是一種特殊的資料結構,能夠以易於遍歷的形式儲存資料。這使得查詢操作更加高效,因為資料函式庫可以直接存取所需的資料,而無需掃描整個集合。

索引的好處

  • 提高查詢效能:索引可以大幅減少查詢所需的時間,特別是在大型資料集合中。
  • 加速排序和分組操作:索引可以幫助資料函式庫更快地對資料進行排序和分組。

預設 _id 索引

在 MongoDB 中,每個集合都有一個預設的 _id 索引。這個索引是唯一的,用於確保每個檔案在集合中都有一個唯一的識別符號。

_id 索引的屬性

  • 唯一性:_id 索引確保每個檔案都有一個唯一的值。
  • 自動建立:MongoDB 自動為每個集合建立 _id 索引。

建立索引

除了預設的 _id 索引外,您還可以在 MongoDB 中建立自定義索引。這可以根據您的查詢需求來完成,以提高查詢效能。

如何建立索引

db.collection.createIndex({ field: 1 });

內容解密:

  • db.collection.createIndex():用於在指定集合上建立索引的方法。
  • { field: 1 }:指定要建立索引的欄位。其中 1 表示升序索引,-1 表示降序索引。

MongoDB 中的索引型別

MongoDB 支援多種不同型別的索引,以滿足不同的查詢需求。

常見的索引型別

  • 單一欄位索引:對單一欄位建立索引。
  • 複合索引:對多個欄位建立索引。
  • 多鍵索引:對陣列欄位建立索引。
  • 文字索引:對文字欄位建立索引,以支援全文搜尋。
  • 地理空間索引:對地理空間資料建立索引,以支援地理空間查詢。

索引屬性

在建立索引時,您可以指定一些屬性來控制索引的行為。

常見的索引屬性

  • unique:確保索引的唯一性。
  • sparse:只對存在指定欄位的檔案建立索引。
  • partialFilterExpression:根據指定的篩選條件建立部分索引。

問題

  1. 什麼是資料函式倉管理系統中的索引?
  2. MongoDB 中的預設 _id 索引有什麼作用?
  3. 如何在 MongoDB 中建立自定義索引?
  4. MongoDB 中有哪些不同型別的索引?
  5. 如何使用索引屬性來控制索引行為?

MongoDB 索引詳解

索引的重要性與基本概念

在 MongoDB 中,索引是一種特殊的資料結構,能夠有效地儲存並管理資料,使查詢更為快速。索引通常與 MongoDB 檔案中的特定欄位相關聯,可以針對單一欄位或多個欄位建立索引,以提高查詢效率。

索引的作用

索引在 MongoDB 的查詢效能上扮演著至關重要的角色。適當的索引可以大幅提升應用程式的效能。當集合中沒有建立索引時,MongoDB 的查詢需要掃描整個集合中的所有檔案,以匹配查詢條件。相反,當集合中存在適當的索引時,查詢可以根據索引快速定位到相關檔案,從而避免掃描整個集合。

MongoDB 中的索引特點

  • 集合層級的索引定義:MongoDB 支援在集合層級上定義索引。
  • 支援多樣化的索引欄位:可以對任意欄位或子欄位建立索引。
  • 預設的 _id 索引:當建立集合時,MongoDB 會自動為 _id 欄位建立索引。

_id 索引的特性

  • 自動建立:當在 MongoDB 中建立集合時,會自動為 _id 欄位建立索引。
  • 唯一性:每個檔案在 _id 欄位上的值都是唯一的。
  • _id 欄位的資料型別:除了陣列以外, _id 可以是任何 BSON 資料型別。
  • 不可刪除:MongoDB 不允許刪除 _id 索引。

ObjectId 的結構

ObjectId 是一種特殊的 MongoDB 資料型別,用於儲存唯一的鍵值 ID。它由 12 個位元組組成,分為四個部分:

部分名稱大小(位元組)
Timestamp4
Machine Id3
Process Id2
Counter3

建立與管理索引

建立範例資料集

首先,我們建立一個名為 BPBBooksBestSellingEditionsWithIndex 的變數,並填充相關資料。

var BPBBooksBestSellingEditionsWithIndex = [{
    'Title': 'Cloud Computing',
    'Year': '2019',
    'ISBN': '9789388511407',
    'Pages': 330,
    'Weight': '570gm',
    'Dimension': '23x19x1.5cm',
    'Tags': ['Cloud Computing', 'Cloud Computing Concepts', 'Non Programming'],
    'InStock': [{
        'Type': 'Paperback',
        'Quantity': 3000
    },
    {
        'Type': 'Hardcover',
        'Quantity': 1500
    }
    ],
    'SpecialOfferDiscount': '100'
}, {
    // ... 其他資料
}];

索引的建立與使用

後續章節將介紹如何在 MongoDB 中建立索引、瞭解不同型別的索引、以及如何利用索引最佳化查詢效能。

索引限制

MongoDB 對索引有一些限制,瞭解這些限制對於有效地使用索引至關重要。

主要限制

  • 索引數量限制:每個集合最多可以有 64 個索引。
  • 索引鍵長度限制:索引鍵的總長度有限制,超過此限制的索引鍵將無法建立。