格式對比 MySQLpython
update table set .... where ....
db.collection.updateOne(query,update,upsert)
db.collection.updateOne(query,update,upsert)
功能 修改第一個複合條件的文檔數組
參數函數
query 篩選條件,用法同 find update 要修改的數據項, 配合修改操做符 upsert bool類型 設置爲 true 未查到則插入新文檔 設置爲 false 默認是 false, 未查到則不修改
實例spa
將 aa 的年齡修改成 19 歲 > db.class.updateOne({name:"aa"},{$set:{age:19}}) { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
未添加 upsert 爲 true 時, 無匹配, 所以沒變化 > db.class.updateOne({name:"ww"},{$set:{age:19}}) { "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0 }
設置 upsert 爲 true 時, 無匹配則會插入新文檔 > db.class.updateOne({name:"ww"},{$set:{age:19}},{upsert:true}) { "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0, "upsertedId" : ObjectId("5c779dbbe0253ec903878cd0")
db.collection.updateMany(query,update,upsert)
功能 修改全部符合條件的文檔code
參數 同 updateOneblog
實例排序
將全部年齡 小於18 的修改成 21 > db.class.updateMany({age:{$lt:18}},{$set:{age:21}}) { "acknowledged" : true, "matchedCount" : 6, "modifiedCount" : 6 } >
db.collection.update(query,update,upsert,multi)
功能 修改文檔索引
參數文檔
query 用法同 updateOne/updateMany
update 用法同 updateOne/updateMany
upsert 功能同 updateOne/updateMany
寫法上不在寫在 {} 中, 直接 upsert=true/false 便可
multi bool 值 multi=false 同 updateOne 只修改首條 默認爲 false multi=true 同 updateMany 修改所有
ps:it
mongoDB 所有的參數都位置傳參,若是想傳第四個,就必須傳入第三個參數
實例
> db.class.update({age:21},{$set:{age:88}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) upsert 使用的時候,直接寫 bool 便可 > db.class.update({name:"yy"},{$set:{age:88}},true) WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : ObjectId("5c77a57ee0253ec903878d10") }) multi 使用同 upsert, 直接寫 bool 便可 > db.class.update({age:21},{$set:{age:88}},true,true) WriteResult({ "nMatched" : 5, "nUpserted" : 0, "nModified" : 5 }) >
db.collection.findOneAndUpdate(query,update)
功能 查找第一個複合條件文檔, 而後修改
參數 query update 用法同 updateOne/updateMany
返回值 修改前的文檔
實例
查找名字 叫 cc 文檔, 修改年齡爲 26
> db.class.findOneAndUpdate({name:"cc"},{$set:{age:26}}) { "_id" : ObjectId("5c77910c4b2b9d43636830ca"), "name" : "cc", "age" : 88, "sex" : "b", "hobby" : [ "python", "football", "computer" ] }
db.collection.findOneAndReplace(query,doc)
功能 查找第一個複合條件文檔, 而後替換
參數
query 用法同 updateOne/updateMany
doc 要替換的文檔
返回值 修改前的文檔
查找 名字 叫 cc 的文檔, 將內容替換成 名字叫 zz 年齡 16 歲
> db.class.findOneAndReplace({name:"cc"},{name:"zz",age:16}) { "_id" : ObjectId("5c77910c4b2b9d43636830ca"), "name" : "cc", "age" : 26, "sex" : "b", "hobby" : [ "python", "football", "computer" ] }
若是 query 設置爲空,則能夠對第一條內容進行替換 > db.class.findOneAndReplace({},{name:"kk",age:16}) { "_id" : ObjectId("5c7790c94b2b9d43636830c8"), "name" : "aa", "age" : 19, "sex" : "b", "hobby" : [ "draw", "dance", "running" ] }
修改的時候必需要使用修改器
若是用較老的 update 方法 確實能夠不使用修改器, 可是實現效果是替換很不理想
本意想 查找 名字 yy 的文檔,將 age 改成 99
> db.class.update({name:"yy"},{age:99}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前: { "name" : "yy", "age" : 88 } 修改後: { "age" : 99 }
修改一個域, 或者增長一個域
查找 age 爲 99 的文檔, 將名字 改成 yy
> db.class.update({age:99},{$set:{name:"yy"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前:{ "age" : 99} 修改後:{ "age" : 99, "name" : "yy" }
刪除一個域
ps:
官方推薦 選定被刪除域的時候值用 "" 空便可,當前其實隨便字符都行,重點是匹配域, 而不是值
去除掉 年齡 99 的文檔中的 age 域
> db.class.update({age:99},{$unset:{age:""}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前: { "age" : 99, "name" : "yy" } 修改後: { "age" : 99}
重命名一個域
將全部的含有 sex 域的文檔的 sex 域 更名爲 gender
> db.class.updateMany({sex:{$exists:true}},{$rename:{sex:"gender"}}) { "acknowledged" : true, "matchedCount" : 6, "modifiedCount" : 6 }
其實也不用刻意的去篩選, 系統會自動對存在該域的文檔進行處理, 因此直接 {} 便可
> db.class.updateMany({},{$rename:{gender:"sex"}}) { "acknowledged" : true, "matchedCount" : 10, "modifiedCount" : 6 }
加法修改器
讓全部文檔的 年齡 +1
> db.class.updateMany({},{$inc:{age:1}}) { "acknowledged" : true, "matchedCount" : 10, "modifiedCount" : 10 }
修改前: { "name" : "yy" } 修改後: { "name" : "yy", "age" : 1 }
ps:
值能夠是正數,負數或者小數
麼有年齡字段的會產生 age:1 字段
乘法修改器
用法,參數同加法,只是運算由加法換成乘法
ps:
怎麼除法? *0.5 = /2
當使用 update* 插入文檔時 ,做爲 補充 內容
update* 在篩選沒法命中存在文檔時能夠添加新內容,可是插入內容是全面 query 和 update 部分
當須要加入 額外字段 的時候, 使用此修改器
查找 name 爲 77 age 爲 15 的文檔(查不到), 設置內容爲 eat 域 的值爲 many ,而且 額外加入 run 域 值爲 fast
> db.class.updateOne({name:"77",age:15},{$set:{eat:"many"},$setOnInsert:{run:"fast"}},{upsert:true}) { "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0, "upsertedId" : ObjectId("5c788dbce0253ec903878dba") } >
ps:
因而可知其實 update 的第二個參數 update 是能夠多個修改器同時使用的
查找 名字 爲 77 的文檔, 將將 名字 改成 22 , 而且 去除 eat 域
> db.class.update({name:"77"},{$set:{age:22},$unset:{eat:""}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前: { "age" : 15, "name" : "77", "eat" : "many", "run" : "fast" } 修改後: { "age" : 22, "name" : "77", "run" : "fast" }
指定值不低於下限
指定某個域的值若是小於該值則修改成該值, 大於則不變
指定 name 爲 77 的文檔的 age 域 的值 不能小於 20
> db.class.update({name:"77"},{$max:{age:20}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
修改前: { "age" : 22, "name" : "77", "run" : "fast" } 修改後: { "age" : 22, "name" : "77", "run" : "fast" }
指定 name 爲 77 的文檔 的 age 域 的值 不能小於 30
> db.class.update({name:"77"},{$max:{age:30}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前: { "age" : 22, "name" : "77", "run" : "fast" } 修改後: { "age" : 30, "name" : "77", "run" : "fast" }
指定值不低於上限
用法同 $max 控制最大值不超過設定值,大於了就改爲設定值
向數組中添加一項
查找 name 爲 dd 的文檔, 將 hobby 域內的數組 增長一項 sing
> db.class.update({name:"dd"},{$push:{hobby:"sing"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前: { "name" : "dd", "age" : 88, "hobby" : [ "football", "computer" ], "sex" : "b" } 修改後: { "name" : "dd", "age" : 88, "hobby" : [ "football", "computer", "sing" ], "sex" : "b" }
向數組中添加多項
查找 name 爲 dd 的文檔, 將 hobby 域內的數組 增長多項 eat、run、cry
> db.class.update({name:"dd"},{$pushAll:{hobby:["eat","run","cry"]}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前: { "name" : "dd", "age" : 88, "hobby" : [ "football" ], "sex" : "b" } 修改後: { "name" : "dd", "age" : 88, "hobby" : [ "football", "eat", "run", "cry" ], "sex" : "b" }
從數組中刪除一個值,若是有重複的值, 會所有刪除
查找 名字 爲 dd 刪除 hobby 域內數組 的 eat
> db.class.update({name:"dd"},{$pull:{hobby:"eat"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前: { "name" : "dd", "age" : 88, "hobby" : [ "football", "eat", "run", "cry" ], "sex" : "b" } 修改後: { "name" : "dd", "age" : 88, "hobby" : [ "football", "run", "cry" ], "sex" : "b" }
從數組中刪除多個值、若是有重複的值, 會所有刪除
刪除的時候也能夠按照條件刪除
查找 名字 爲 dd 的文檔,刪除 hobby 域內數組的 eat、run
> db.class.update({name:"dd"},{$pullAll:{hobby:["eat","run"]}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前: { "name" : "dd", "age" : 88, "hobby" : [ "football", "eat", "run", "cry" ], "sex" : "b" } 修改後: { "name" : "dd", "age" : 88, "hobby" : [ "football", "cry" ], "sex" : "b" }
彈出數組中一項
只能彈出兩頭的第一個內容
取值 爲 1 彈出最後一項
取值 爲 -1 彈出第一項
刪除 名字 爲 dd 的 hobby 域內數組的 第一項
> db.class.update({name:"dd"},{$pop:{hobby:1}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前: { "name" : "dd", "hobby" : [ "football", "eat", "run", "cry" ] } 修改後: { "name" : "dd", "hobby" : [ "football", "eat", "run" ] }
刪除 名字 爲 dd 的 hobby 域內數組的 最後一項 > db.class.update({name:"dd"},{$pop:{hobby:-1}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前: { "name" : "dd", "hobby" : [ "football", "eat", "run", "cry" ] } 修改後: { "name" : "dd", "hobby" : [ "eat", "run", "cry" ] }
向數組中添加一項
不能和已有值重複
若是是重複值則不作任何操做
查找 name 爲 mm 的文檔, 將 score 域內數組 添加 18 ,若存在則不做修改
> db.class.updateOne({name:"mm"},{$addToSet:{score:18}}) { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
修改前: { "name" : "mm", "age" : 12, "score" : [ 12, 16, 17 ] } 修改後: { "name" : "mm", "age" : 12, "score" : [ 12, 16, 17, 18 ] }
查找 name 爲 mm 的文檔, 將 score 域內數組 添加 18 ,若存在則不做修改
> db.class.updateOne({name:"mm"},{$addToSet:{score:18}})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
修改前: { "name" : "mm", "age" : 12, "score" : [ 12, 16, 17, 18 ] } 修改後: { "name" : "mm", "age" : 12, "score" : [ 12, 16, 17, 18 ] }
對多個值逐一操做
查找 name 爲 mm 的文檔, 將 score 域內數組 逐一添加 89,26
> db.class.updateOne({name:"mm"},{$push:{score:{$each:[89,26]}}}) { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
修改前: { "name" : "mm", "age" : 12, "score" : [ 12, 16, 17, 18 ] } 修改後: { "name" : "mm", "age" : 12, "score" : [ 12, 16, 17, 18, 89, 26 ] }
指定位置插入
須要配合 $each 使用, $each 提供值
$position 指定索引位置
查找 name 爲 mm 的文檔,在 score 域內數組 將 90 添加在 索引 0 的位置
> db.class.updateOne({name:"mm"},{$push:{score:{$each:[90],$position:0}}}) { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
修改前: { "name" : "mm", "age" : 12, "score" : [ 12, 16, 17, 18 ] } 修改後: { "name" : "mm", "age" : 12, "score" : [ 90, 12, 16, 17, 18 ] }
對數組排序
搭配 $each 使用
1 爲升序,
-1 爲降序
查找 name 爲 mm 的文檔 ,將 score 域內數組 升序排列
> db.class.updateOne({name:"mm"},{$push:{score:{$each:[],$sort:1}}}) { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
修改前: { "name" : "mm", "age" : 12, "score" : [ 90, 12, 19, 17, 18 ] } 修改後: { "name" : "mm", "age" : 12, "score" : [ 12, 17, 18, 19, 90] }