MongoDB自学笔记12---4.4更新文档
4.4 更新文档 Mongodb的增删查都已经学完了,只剩下更新了。在mongodb中提供了update()和save()方法用于更新一个文档,update()是使用最多的,save()在前面4.1插入文档的时候已经介绍了,这里就不再介绍了。 update语法如下: db.collection.update(criteria
4.4 更新文档
Mongodb的增删查都已经学完了,只剩下更新了。在mongodb中提供了update()和save()方法用于更新一个文档,update()是使用最多的,save()在前面4.1插入文档的时候已经介绍了,这里就不再介绍了。
update语法如下:
db.collection.update(criteria,objNew,upsert,multi)
参数说明:
criteria:设置查询条件,用于查询哪些文档需要被更新.
objNew:更新后的对象
upsert:设置为真的时候如果记录已经存在,更新它,否则新增一个记录,默认为false
multi:设置为真的时候,将会更新所有符合查询条件的文档。在mongodb中默认情况下只会更新第一条符合的文档。此方法必须与某些$开头的方法配合使用。
> db.user.find()
{ "_id" : 1, "name" : "user1","age" : 1 }
{ "_id" : 2, "name" : "user2","age" : 2 }
{ "_id" : 3, "name" : "user3","age" : 3 }
{ "_id" : 4, "name" : "user4","age" : 4 }
{ "_id" : 5, "name" : "user5","age" : 5 }
{ "_id" : 6, "name" : "user6","age" : 6 }
>db.user.update({name:"user1"},{name:"user11"}) -->我们可以省略后两个参数
> db.user.find()
{ "_id" : 1, "name" : "user11" }
{ "_id" : 2, "name" : "user2","age" : 2 }
{ "_id" : 3, "name" : "user3","age" : 3 }
{ "_id" : 4, "name" : "user4","age" : 4 }
{ "_id" : 5, "name" : "user5","age" : 5 }
{ "_id" : 6, "name" : "user6","age" : 6 }
我们本想将user1改为user11,其他不变,但是我们看查询结果,mongodb将我们的整个文档更新了.所以我们如果要是使用上面那样的方式,更新文档,将会更新整个文档.这点需要注意.那么我们怎样才能只将user1,更新为user11呢?我们只要使用mongodb的$set方法即可,在后面我会讲解.
> db.user.find()
{ "_id" : 2, "name" : "user2","age" : 2 }
{ "_id" : 3, "name" : "user3","age" : 3 }
{ "_id" : 4, "name" : "user4","age" : 4 }
{ "_id" : 5, "name" : "user5","age" : 5 }
{ "_id" : 6, "name" : "user6","age" : 6 }
{ "_id" : 1, "name" : "user1","age" : 1 }
{ "_id" : 7, "name" : "user1","age" : 7 }
{ "_id" : 8, "name" : "user1","age" : 8 }
> db.user.update({name:"user1"},{name:"user11"},1,0)/*只会更新一条数据,但是如果在这里我们直接将最后一个参数改为1,将会报错,因为这个参数需要与$方法联合使用 */
> db.user.find()
{ "_id" : 2, "name" : "user2","age" : 2 }
{ "_id" : 3, "name" : "user3","age" : 3 }
{ "_id" : 4, "name" : "user4","age" : 4 }
{ "_id" : 5, "name" : "user5","age" : 5 }
{ "_id" : 6, "name" : "user6","age" : 6 }
{ "_id" : 1, "name" : "user11" }
{ "_id" : 7, "name" : "user1","age" : 7 }
{"_id":8,"name":"user1","age":8} >db.user.update({name:"user111"},{name:"user111"},1,0)/*这时候我们更新name为user111的文档,但是没有,我们的第三个参数设置为了true,所以这时候将会插入一条新的文档,结果如下面一样 */
> db.user.find()
{ "_id" : 2, "name" : "user2","age" : 2 }
{ "_id" : 3, "name" : "user3","age" : 3 }
{ "_id" : 4, "name" : "user4","age" : 4 }
{ "_id" : 5, "name" : "user5","age" : 5 }
{ "_id" : 6, "name" : "user6","age" : 6 }
{ "_id" : 1, "name" : "user11" }
{ "_id" : 7, "name" : "user1","age" : 7 }
{ "_id" : 8, "name" : "user1","age" : 8 }
{ "_id" : ObjectId("519a2c8259827a002f7e5ace"),"name" : "user111" }
显示一下第四个参数:
>db.user.update({name:"user1"},{$set:{name:"userNew"}},0,1)
> db.user.find()
{ "_id" : 2, "name" : "user2","age" : 2 }
{ "_id" : 3, "name" : "user3","age" : 3 }
{ "_id" : 4, "name" : "user4","age" : 4 }
{ "_id" : 5, "name" : "user5","age" : 5 }
{ "_id" : 6, "name" : "user6","age" : 6 }
{ "_id" : 1, "name" : "user11" }
{ "_id" : 7, "age" : 7, "name" :"userNew" }
{ "_id" : 8, "age" : 8, "name" :"userNew" }
{ "_id" : ObjectId("519a2c8259827a002f7e5ace"),"name" : "user111" }
这里我们使用$set,这个就是只是去修改文档中某些值,而不是更新整个文档。
4.4.1 更新方法
在mongodb中提供了很多与更新操作有关的方法,我们也可以叫它更新操作符。这些操作符主要可以分为两类:字段和数组。
字段组的主要包括:$inc、$rename、$setOnInsert、$set、$unset。
数组组的主要包括:$addToSet、$pop、$pullAll、$pull、$pushAll、$push、$each、$slice、$sort。
下面我们详细的介绍一下。
$inc
语法:db.collection.update({ field: value }, { $inc: { field1: amount } } );
为一个字段添加加上一个值,这个方法只能对数字操作,也就是说只能给数字加上一个值,当然这个值可以是负数。
> db.user.find()
{ "_id" : 2, "name" : "user2","age" : 2 }
{ "_id" : 3, "name" : "user3","age" : 3 }
{ "_id" : 4, "name" : "user4","age" : 4 }
{ "_id" : 5, "name" : "user5","age" : 5 }
{ "_id" : 6, "name" : "user6","age" : 6 }
> db.user.update({name:"user2"},{$inc:{age:10}}) /*将name为user2的年龄age加上10 */
> db.user.find()
{ "_id" : 2, "name" : "user2","age" : 12 }
{ "_id" : 3, "name" : "user3","age" : 3 }
{ "_id" : 4, "name" : "user4","age" : 4 }
{ "_id" : 5, "name" : "user5","age" : 5 }
{ "_id" : 6, "name" : "user6","age" : 6 }
> db.user.update({name:"user6"},{$inc:{age:-4}}) /*将name为user6的年龄age加上-4,也就是减去4*/
> db.user.find()
{ "_id" : 2, "name" : "user2","age" : 12 }
{ "_id" : 3, "name" : "user3","age" : 3 }
{ "_id" : 4, "name" : "user4","age" : 4 }
{ "_id" : 5, "name" : "user5","age" : 5 }
{ "_id" : 6, "name" : "user6","age" : 2 }
$set
语法:db.collection.update({ field: value1 }, { $set: { field1: value2 } } );
当文档中包含该字段的时候,更新该字段值为value2,如果该文档中没有该字段,则为本文档添加一个字段file1,并为其赋值给value2。
> db.user.find()
{ "_id" : 2, "name" : "user2","age" : 12 }
{ "_id" : 3, "name" : "user3","age" : 3 }
{ "_id" : 4, "name" : "user4","age" : 4 }
{ "_id" : 5, "name" : "user5","age" : 5 }
{ "_id" : 6, "name" : "user6","age" : 2 }
> db.user.update({name:"user2"},{$set:{age:20}}) /*将name为user2的age设置为20 */
> db.user.find()
{ "_id" : 2, "name" : "user2","age" : 20 }
{ "_id" : 3, "name" : "user3","age" : 3 }
{ "_id" : 4, "name" : "user4","age" : 4 }
{ "_id" : 5, "name" : "user5","age" : 5 }
{ "_id" : 6, "name" : "user6","age" : 2 }
> db.user.update({name:"user2"},{$set:{sex:"nan"}})/*将name为user2的sex设置为nan,但是没有该字段,所以为该文档添加sex字段并赋值为nan */
> db.user.find()
{ "_id" : 3, "name" : "user3","age" : 3 }
{ "_id" : 4, "name" : "user4","age" : 4 }
{ "_id" : 5, "name" : "user5","age" : 5 }
{ "_id" : 6, "name" : "user6","age" : 2 }
{ "_id" : 2, "age" : 20, "name" :"user2", "sex" : "nan" }
$unset
语法:db.collection.update({ field: value1 }, { $unset: { field1:
参数arg可以使用true或者空字符串””,这样都会删除一个字段。
> db.user.find()
{ "_id" : 3, "name" : "user3","age" : 3 }
{ "_id" : 4, "name" : "user4","age" : 4 }
{ "_id" : 5, "name" : "user5","age" : 5 }
{ "_id" : 6, "name" : "user6","age" : 2 }
{ "_id" : 2, "age" : 20, "name" :"user2", "sex" : "nan" }
> db.user.update({name:"user2"},{$unset:{sex:1}}) /*删除name为user2的sex字段.如果删除一个不存在的字段,并不会报错,没有什么效果 */
> db.user.find()
{ "_id" : 3, "name" : "user3","age" : 3 }
{ "_id" : 4, "name" : "user4","age" : 4 }
{ "_id" : 5, "name" : "user5","age" : 5 }
{ "_id" : 6, "name" : "user6","age" : 2 }
{ "_id" : 2, "age" : 20, "name" :"user2" }
$rename
语法:{$rename: {
为文档中的一个或者多个字段改名。
> db.test.find()
{ "_id" : 1, "ary" : [ 3, 4, 5, [ 6, 7 ], 9 ]}
{ "_id" : 2, "ary" : [ 6 ], "text" :"test" }
> db.test.update({_id:1},{$rename:{ary:"aryNew"}})
> db.test.find()
{ "_id" : 1, "aryNew" : [ 3, 4, 5, [ 6, 7 ], 9 ]}
{ "_id" : 2, "ary" : [ 6 ], "text" :"test" }
$setOnInsert
语法:db.collection.update(
{ $setOnInsert:{
{upsert: true }
)
$setOnInsert只有在upsert设置为true,并且被更新的文档不存在此集合中,需要插入一个新的文档的时候才起作用。在插入的时候会为新插入的文档添加给定的字段。
>db.user.update({name:"user1"},{_id:1,name:"user1"},1)
> db.user.find()
{ "_id" : 1, "name" : "user1" }
>db.user.update({name:"user2"},{$setOnInsert:{name:"user2",age:2}},1)
> db.user.find()
{ "_id" : 1, "name" : "user1" }
{ "_id" : ObjectId("51a02848d02692fff25c4238"),"age" : 2, "name" : "user2" }
> db.user.update({name:"user2"},{$setOnInsert:{name:"user3",age:3}},1)
> db.user.find()
{ "_id" : 1, "name" : "user1" }
{ "_id" : ObjectId("51a02848d02692fff25c4238"),"age" : 2, "name" : "user2" }
这个方法是在mongodb2.4中新加入的,具体在什么情况下使用,还不是很清楚。
$push
语法:db.collection.update(
{ $push:{
)
将一个数字存入一个数组,分为三种情况,如果该字段存在,则直接将数字存入数组.如果该字段不存在,创建字段并且将数字插入该数组.如果更新的字段不是数组,会报错的.
> db.test.find()
{ "_id" : 1, "ary" : [ 1, 2, 3, 4 ] }
{ "_id" : 2, "text" : "test" }
> db.test.update({_id:1},{$push:{ary:5}}) -->数组存在 直接存入
> db.test.find()
{ "_id" : 2, "text" : "test" }
{ "_id" : 1, "ary" : [ 1, 2, 3, 4, 5 ] }
> db.test.update({_id:2},{$push:{ary:6}}) -->数组不村子,创建数组并存入
> db.test.find()
{ "_id" : 2, "ary" : [ 6 ], "text" :"test" }
{ "_id" : 1, "ary" : [ 1, 2, 3, 4, 5 ] }
> db.test.update({_id:2},{$push:{text:6}}) -->更新字段存在但不是数组报错
Cannot apply $push/$pushAll modifier to non-array
如果我们想将多个值一起压入我们可能会将一个数组直接存入,但是这样是不对的,$push一次只会存入一个字段,代码如下:
> db.test.update({_id:1},{$push:{ary:[6,7]}})
> db.test.find()
{ "_id" : 2, "ary" : [ 6 ], "text" :"test" }
{ "_id" : 1, "ary" : [ 1, 2, 3, 4, 5, [ 6, 7 ] ]}
实现上面的功能我们可以使用下面的$pushAll。
$pushAll
语法:db.collection.update({ field: value }, { $pushAll: { field1: [ value1, value2, value3 ] } } );
将多个数值一次存入数组.
> db.test.find()
{ "_id" : 2, "ary" : [ 6 ], "text" :"test" }
{ "_id" : 1, "ary" : [ 1, 2, 3, 4, 5, [ 6, 7 ] ]}
> db.test.update({_id:1},{$pushAll:{ary:[8,9]}})
> db.test.find()
{ "_id" : 2, "ary" : [ 6 ], "text" :"test" }
{ "_id" : 1, "ary" : [ 1, 2, 3, 4, 5, [ 6, 7 ],8, 9 ] }
$addToSet
语法:db.collection.update( { field: value }, {$addToSet: { field: value1 } } );
与$push功能相同讲一个数字存入数组,不同的是如果数组中有这个数字,将不会插入,只会插入新的数据,同样也会有三种情况,与$push相同.
> db.test.find()
{ "_id" : 2, "ary" : [ 6 ], "text" :"test" }
{ "_id" : 1, "ary" : [ 1, 2, 3, 4, 5, [ 6, 7 ],8, 9 ] }
> db.test.update({_id:2},{$addToSet:{ary:7}}) -->ary中没有7,插入成功
> db.test.find()
{ "_id" : 1, "ary" : [ 1, 2, 3, 4, 5, [ 6, 7 ],8, 9 ] }
{ "_id" : 2, "ary" : [ 6, 7 ], "text": "test" }
> db.test.update({_id:2},{$addToSet:{ary:7}}) -->ary中有7,插入失败
> db.test.find()
{ "_id" : 1, "ary" : [ 1, 2, 3, 4, 5, [ 6, 7 ],8, 9 ] }
{ "_id" : 2, "ary" : [ 6, 7 ], "text": "test" }
$pop
语法:db.collection.update( {field: value }, { $pop:{ field:,
删除数组最后一个或者第一个元素。如果参数arg设置为1,删除最后一个元素,如果设置为-1,则删除第一个元素。
> db.test.find()
{ "_id" : 1, "ary" : [ 1, 2, 3, 4, 5, [ 6, 7 ],8, 9 ] }
{ "_id" : 2, "ary" : [ 6, 7 ], "text": "test" }
> db.test.update({_id:2},{$pop:{ary:1}})
> db.test.find()
{ "_id" : 1, "ary" : [ 1, 2, 3, 4, 5, [ 6, 7 ],8, 9 ] }
{ "_id" : 2, "ary" : [ 6 ], "text" :"test" }
$pull
语法:db.collection.update( { field:
删除数组中的一个元素,如果删除的字段不是数组,会报错
> db.test.find()
{ "_id" : 1, "ary" : [ 1, 2, 3, 4, 5, [ 6, 7 ],8, 9 ] }
{ "_id" : 2, "ary" : [ 6 ], "text" :"test" }
> db.test.update({_id:1},{$pull:{ary:8}})
> db.test.find()
{ "_id" : 1, "ary" : [ 1, 2, 3, 4, 5, [ 6, 7 ],9 ] }
{ "_id" : 2, "ary" : [ 6 ], "text" :"test" }
$pullAll
语法:db.collection.update( { field: value }, {$pushAll: { field1: [ value1, value2, value3 ] } } );
删除数组中的多个值,跟pushAll与push的关系类似.
> db.test.find()
{ "_id" : 1, "ary" : [ 1, 2, 3, 4, 5, [ 6, 7 ],9 ] }
{ "_id" : 2, "ary" : [ 6 ], "text" :"test" }
> db.test.update({_id:1},{$pullAll:{ary:[1,2,8]}})
> db.test.find()
{ "_id" : 1, "ary" : [ 3, 4, 5, [ 6, 7 ], 9 ]}
{ "_id" : 2, "ary" : [ 6 ], "text" :"test" }
$each
$each只能和$addToSet或者$push结合使用,将多个值一次存入数组。
语法如下:
结合$addToSet:
db.collection.update(
{
$addToSet: {
}
)
结合$push:
db.collection.update(
{
$push:{
}
)
结合$addToSet使用的一段例子代码如下:
> db.c5.find()
{ "_id" : 1, "ary" : [ 1 ] }
> db.c5.update({_id:1},{$addToSet:{ary:{$each:[1,2,3,4]}}})
> db.c5.find()
{ "_id" : 1, "ary" : [ 1, 2, 3, 4 ] }
$slice
语法:db.collection.update(
{ $push: {
$each: [
$slice:
}
}
}
)
$slice需要和$push结合使用,截取一定长度的数组。参数num是小于或者等于0的数。如果num等于0表示的是返回的是一个空数组,如果是负数表示从后向前截取负数绝对值长度的数组。具体看下面代码:
> db.c5.find()
{ "_id" : 1, "ary" : [ 2, 3 ] }
> db.c5.update({_id:1},{$push:{ary:{$each:[1,2,3],$slice:-0}}})
> db.c5.find()
{ "_id" : 1, "ary" : [ ] }
> db.c5.update({_id:1},{$push:{ary:{$each:[1,2,3],$slice:-2}}})
> db.c5.find()
{ "_id" : 1, "ary" : [ 2, 3 ] }
$sort
语法:db.collection.update(
{ $push:{
$each: [
...
],
$slice:
$sort:
}
}
}
)
$sort将数组中的元素按照一定的规则进行排序,同样1表示正序,-1表示倒序。
$sort必须与$push、$each结合使用,并且$each值的数组中的元素都必须为对象。
> db.c5.find()
{ "_id" : 1, "ary" : [ ] }
>db.c5.update({_id:1},{$push:{ary:{$each:[{_id:1,score:3},{_id:2,score:5},{_id:3,score:1}],$slice:-5,$sort:{score:-1}}}})
> db.c5.find()
{ "_id" : 1, "ary" : [ { "_id" : 2,"score" : 5 }, {"_id" : 1, "score" : 3 }, {"_id" : 3, "score" : 1 } ] }

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

小夥伴電腦出現這樣的故障,開啟「此電腦」和C碟檔案會提示「Explorer.EXEWindows無法存取指定裝置、路徑或檔案。你可能沒有適當的權限存取存取專案。」包括資料夾、檔案、此電腦、回收站等,雙擊都會彈出這樣的窗口,右鍵又是正常的。這是系統更新導致,如果你也遇到這樣的狀況,下面小編教大家如何解決。一,開啟登錄編輯程式Win+R,輸入regedit,或右鍵開始選單執行輸入regedit;二,定位登錄機「電腦\HKEY_CLASSES_ROOT\PackagedCom\ClassInd

Windows更新可能導致以下一些問題:1.相容性問題:某些應用程式、驅動程式或硬體裝置可能與新的Windows更新不相容,導致它們無法正常運作或崩潰。 2.效能問題:有時,Windows更新可能會導致系統變得更慢或出現效能下降的情況。這可能是由於新的功能或改進需要更多資源來運作。 3.系統穩定性問題:某些用戶報告稱,在安裝Windows更新後,系統可能會出現意外的崩潰或藍屏錯誤。 4.資料遺失:在罕見的情況下,Windows更新可能會導致資料遺失或檔案損壞。這是為什麼在進行任何重要的更新之前,請備份您

本文介紹如何在Debian系統上配置MongoDB實現自動擴容,主要步驟包括MongoDB副本集的設置和磁盤空間監控。一、MongoDB安裝首先,確保已在Debian系統上安裝MongoDB。使用以下命令安裝:sudoaptupdatesudoaptinstall-ymongodb-org二、配置MongoDB副本集MongoDB副本集確保高可用性和數據冗餘,是實現自動擴容的基礎。啟動MongoDB服務:sudosystemctlstartmongodsudosys

瀏覽器更新升級並不少見,我們上網遇到的一些問題也許就是系統沒能及時更新造成的。穩定地更新才能確保瀏覽器使用正常,我們也才能更好地使用裡面的功能,最大程度發揮瀏覽器效能。那麼谷歌瀏覽器如何更新?本站為大家帶來Google瀏覽器更新的方法,解決大家的困難。 Google瀏覽器更新的方法第一步:開啟Chrome瀏覽器,點選右上角【三個點】。 (如圖)第二步:點選選單下拉中的【設定】進入。 (如圖)第三步:找到右側的【關於Chrome】,點選進入。 (如圖) 、第四步:Chrome瀏覽器會自動檢查並安裝更新。 (如圖所

本文介紹如何在Debian系統上構建高可用性的MongoDB數據庫。我們將探討多種方法,確保數據安全和服務持續運行。關鍵策略:副本集(ReplicaSet):利用副本集實現數據冗餘和自動故障轉移。當主節點出現故障時,副本集會自動選舉新的主節點,保證服務的持續可用性。數據備份與恢復:定期使用mongodump命令進行數據庫備份,並製定有效的恢復策略,以應對數據丟失風險。監控與報警:部署監控工具(如Prometheus、Grafana)實時監控MongoDB的運行狀態,並

在開發一個電商網站時,我遇到了一個棘手的問題:如何為用戶提供個性化的商品推薦。最初,我嘗試了一些簡單的推薦算法,但效果並不理想,用戶的滿意度也因此受到影響。為了提升推薦系統的精度和效率,我決定採用更專業的解決方案。最終,我通過Composer安裝了andres-montanez/recommendations-bundle,這不僅解決了我的問題,還大大提升了推薦系統的性能。可以通過一下地址學習composer:學習地址

能否自學HTML?答案是絕對可以。 1.學習HTML基礎知識,如標籤和結構。 2.理解HTML的定義和工作原理。 3.掌握基本和高級用法,包括語義化標籤和多媒體元素。 4.學會調試常見錯誤和優化代碼。自學HTML需要耐心和堅持,但完全可行。

直接通過 Navicat 查看 MongoDB 密碼是不可能的,因為它以哈希值形式存儲。取回丟失密碼的方法:1. 重置密碼;2. 檢查配置文件(可能包含哈希值);3. 檢查代碼(可能硬編碼密碼)。
