MongoDB更新操作:快速修改文檔的5種方法

MongoDB是一個流行的文檔型數據庫,更新操作是日常使用中非常常見的需求。本文將爲初學者介紹5種最實用的MongoDB更新操作方法,涵蓋修改字段、數值增減、數組操作、完全替換和批量更新等場景,讓你快速掌握文檔修改的核心技能。

一、方法1:使用$set修改字段(增/改字段)

作用$set可以修改已有字段的值,也可以爲文檔添加新字段,其他未指定的字段會被保留。
適用場景:需要更新部分字段(如修改用戶信息中的郵箱、年齡),或爲文檔添加新屬性。

語法

db.集合名稱.updateOne(
  { 查詢條件 },  // 篩選要更新的文檔(必選)
  { $set: { 字段1: 新值, 字段2: 新值, ... } }  // 要修改/添加的字段(必選)
)

示例
假設users集合中有如下文檔:

{
  _id: 1,
  name: "Alice",
  age: 25,
  hobbies: ["reading", "coding"]
}

現在要將Alice的年齡改爲26,並添加新字段city(城市):

db.users.updateOne(
  { name: "Alice" },  // 查詢條件:name爲Alice的文檔
  { $set: { age: 26, city: "Beijing" } }  // 修改age和添加city字段
)

操作後

{
  _id: 1,
  name: "Alice",
  age: 26,
  hobbies: ["reading", "coding"],
  city: "Beijing"  // 新增字段
}

注意:若字段不存在,$set會自動創建該字段;若字段已存在,會直接覆蓋舊值。

二、方法2:使用$inc增減數值(數值型字段)

作用$inc用於對數值型字段進行增量/減量操作(正數增加,負數減少)。
適用場景:計數器、積分、評分等需要動態調整數值的場景。

語法

db.集合名稱.updateOne(
  { 查詢條件 },
  { $inc: { 數值字段: 增量值 } }  // 增量值爲正數時增加,負數時減少
)

示例
假設Alice的積分(score)是80,現在要增加10分:

db.users.updateOne(
  { name: "Alice" },
  { $inc: { score: 10 } }  // score增加10
)

操作後

{
  _id: 1,
  name: "Alice",
  age: 26,
  hobbies: ["reading", "coding"],
  score: 90  // 原80 + 10 = 90
}

注意:若數值字段不存在,$inc會報錯(需先確保字段存在或初始化爲數值);若增量值爲0,則文檔不會被修改。

三、方法3:使用$push向數組添加元素

作用$push用於向數組字段中追加新元素,保留原有數組元素。
適用場景:爲列表、評論、標籤等數組字段添加新內容(如文章評論、商品標籤)。

語法

db.集合名稱.updateOne(
  { 查詢條件 },
  { $push: { 數組字段: 新元素 } }  // 向數組末尾添加新元素
)

示例
假設Alice的hobbies數組要添加“swimming”:

db.users.updateOne(
  { name: "Alice" },
  { $push: { hobbies: "swimming" } }  // 數組末尾新增"swimming"
)

操作後

{
  _id: 1,
  name: "Alice",
  age: 26,
  hobbies: ["reading", "coding", "swimming"],  // 原數組+新元素
  city: "Beijing"
}

注意:若數組不存在,$push會自動創建數組並添加元素;若需避免重複元素,可使用$addToSet(後續進階內容)。

四、方法4:使用replaceOne完全替換文檔

作用replaceOne用一個全新的文檔替換符合條件的第一個文檔,僅保留_id字段(若新文檔不含_id,MongoDB會自動生成新的)。
適用場景:需要整體替換文檔結構(如舊文檔字段過時,需完全重寫)。

語法

db.集合名稱.replaceOne(
  { 查詢條件 },
  { 新文檔內容 }  // 必須包含字段,若需保留原字段需顯式指定
)

示例
將Alice的文檔完全替換爲新結構(保留name_id,新增genderage):

db.users.replaceOne(
  { name: "Alice" },
  { _id: 1, name: "Alice", gender: "female", age: 27 }  // 新文檔
)

操作後

{
  _id: 1,  // 保留原_id
  name: "Alice",
  gender: "female",
  age: 27  // 完全替換原有字段
}

注意:若新文檔不含_id,MongoDB會生成新的_id,原文檔的_id將永久丟失;操作前建議確認新文檔結構,避免數據丟失。

五、方法5:使用updateMany批量更新

作用updateMany所有符合條件的文檔執行更新操作,效率高於循環單條更新。
適用場景:批量修改大量數據(如將所有“待處理”訂單改爲“已處理”)。

語法

db.集合名稱.updateMany(
  { 查詢條件 },  // 匹配多個文檔的條件
  { 更新操作 }  // 與updateOne語法一致
)

示例
將所有age > 25的用戶年齡增加5歲:

db.users.updateMany(
  { age: { $gt: 25 } },  // 查詢條件:age大於25
  { $inc: { age: 5 } }   // 每個匹配文檔的age+5
)

結果:所有符合條件的用戶(假設3個用戶age>25)的age均增加5。

注意:執行後返回matchedCount(匹配的文檔數)和modifiedCount(實際修改的文檔數),可用於驗證更新是否成功。

總結

MongoDB的更新操作靈活多樣,初學者可根據需求選擇合適的方法:
- 改部分字段:用$set(最常用);
- 數值增減:用$inc
- 數組添加:用$push
- 完全替換:用replaceOne
- 批量修改:用updateMany

重要提醒:更新前務必確認查詢條件(where),避免誤更新全表數據;若修改重要數據,建議先備份或測試查詢條件範圍。通過這5種方法,你已能覆蓋日常80%的更新場景,後續可進一步學習$addToSet$pull等更復雜的數組操作。

小夜