MongoDB文檔的更新
3.4 更新文檔
MongoDB通過update函數與save函數來更新集合中的文檔。
3.4.1 update函數
update() 函數用于更新已存在的文檔。
語法格式:
db.集合名稱.update(
<query>,
<update>,
< upsert:boolean>,
< multi:boolean>
)
參數說明:
query : update的查詢條件,類似sql update查詢內where后面的。
update : update的對象和一些更新的操作符等,也可以理解為sql update查詢內set后面的。
upsert : 可選,這個參數的意思是,如果不存在update的記錄,是否插入這個document,true為插入,默認是false,不插入。
multi : 可選,mongodb 默認是false,只更新找到的第一條記錄,如果這個參數為true,就把按條件查出來多條記錄全部更新。
首先插入一條文檔數據:
db.col.insert({
title: 'MongoDB 教程',
description: 'MongoDB 是一個 Nosql 數據庫',
by: '北京尚學堂',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
查看插入結果:

在MongoDB中的update是有兩種更新方式,一種是覆蓋更新,一種是表達式更新。
覆蓋更新:顧名思義,就是通過某條件,將新文檔覆蓋原有文檔。
表達式更新:這種更新方式是通過表達式來實現復雜更新操作,如:字段更新、數值計算、數組操作、字段名修改等。
(一) 表達式更新
通過 update() 方法來更新標題(title):
db.col.update(
{'title':'MongoDB 教程'},
{$set:{'title':'MongoDB'}}
)
查看更新結果:

更多案例:
|
只更新第一條滿足條件的記錄: db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
更新全部滿足條件的記錄: db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
只添加第一條: db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
全部添加進去: db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
只更新第一條記錄:(等同第一個) db.col.update( { "count" : { $lt : 10 } } , { $set : { "count" : 1} },false,false ); |
在表達式更新中,可以進行多種復雜操作。這些操作都通過update參數中的操作符實現。下面來講解些常用更新操作符。首先準備一些數據:
db.stu.insert([{'name':'zhangsan', 'age':20},{'name':'lisi', 'age':22},{'name':'wangwu', 'age':25}]);
1 $inc
用法:{$inc:{field:value}}
作用:對一個數字字段的某個field增加value
示例:將name為zhangsan的學生的age增加5
命令:db.stu.update({name:"zhangsan"},{$inc:{age:5}})
結果:

2 $set
用法:{$set:{field:value}}
作用:把文檔中某個字段field的值設為value
示例:把zhangsan的年齡設為23歲
命令:db.stu.update({name:"zhangsan"},{$set:{age:23}})
結果:

3 $unset
用法:{$unset:{field:1}}
作用:刪除某個字段field
示例:將zhangsan的年齡字段刪除
命令:db.stu.update({name:"zhangsan"},{$unset:{age:1}})
結果:

4 $push
用法:{$push:{field:value}}
作用:把value追加到field里。注:field只能是數組類型,如果field不存在,會自動插入一個數組類型
示例:給zhangsan添加別名"xiaozhang"
命令:db.stu.update({name:"zhangsan"},{$push:{"ailas":"xiaozhang"}})
結果:

5 $addToSet
用法:{$addToSet:{field:value}}
作用:加一個值到數組內,而且只有當這個值在數組中不存在時才增加。
示例:往zhangsan的別名字段里添加兩個別名A1、A2
命令:db.stu.update({name:"zhangsan"},{$addToSet:{"ailas":["A1","A2"]}})
結果:

注意:此處加入的數據是一個數據為A1和A2的數組對象。并不是將兩個數據一次加入ailas數組中。
6 $pop
用法:刪除數組內第一個值:{$pop:{field:-1}}、刪除數組內最后一個值:{$pop:{field:1}}
作用:用于刪除數組內的一個值
示例:刪除zhangsan記錄中alias字段中最后一個別名
命令:db.stu.update({name:"zhangsan"},{$pop:{"ailas":1}})
結果:

7 $pull
用法:{$pull:{field:_value}}
作用:從數組field內刪除一個等于_value的值
示例:刪除zhangs記錄中的別名xiaozhang
命令:db.stu.update({name:"zhangsan"},{$pull:{"ailas":"xiaozhang"}})
結果:

8 $pullAll
用法:{$pullAll:value_array}
作用:用法同$pull一樣,可以一次性刪除數組內的多個值。
示例:刪除zhangsan記錄內的A1和A2別名
命令:db.stu.update({name:"zhangsan"},{$pullAll:{"ailas":["A1","A2"]}})
9 $rename
用法:{$rename:{old_field_name:new_field_name}}
作用:對字段進行重命名
示例:把zhangsan記錄的name字段重命名為sname
命令:db.stu.update({name:"zhangsan"},{$rename:{"name":"sname"}})
結果:

3.4.2 save函數
save()函數的作用是保存文檔,如果文檔存在則覆蓋,如果文檔不存在則新增。save()函數對文檔是否存在的唯一判斷標準是"_id"系統唯一字段是否匹配。所以使用save()函數實現更新操作,則必須提供"_id"字段數據。
save()函數的語法是:
db.集合名稱.save(
<document>
);
參數document代表要修改的文檔內容,要求必須提供"_id"字段數據。
使用save()函數實現更新操作:
db.col.save(
{
"_id" : ObjectId("5d0207e460ad10791be757d2"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一個 Nosql 數據庫",
"by" : "北京尚學堂",
"tags" : [
"mongodb",
"NoSQL"
],
"likes" : 100
}
)
結果:

(二) 覆蓋更新
通過update方法來更新一個完整的文檔:
db.col.update(
{"title" : "MongoDB 教程"},
{
"title" : "MongoDB 教程",
"description" : "MongoDB 是一個 Nosql 數據庫",
"by" : "北京尚學堂",
"likes" : 100
}
)
結果:

浙公網安備 33010602011771號