mongoDB 文檔操做_改

mongoDB 更改操做

格式對比 MySQLpython

update table set .... where ....
db.collection.updateOne(query,update,upsert)

修改函數

updateOne  修改首個

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")

updateMany  修改全部

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 }
    >

update  修改全部

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 })
    >

findOneAndUpdate  查找首個並修改

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" ] }

findOneAndReplace  查找首個並替換

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"
        ]
    }

mongoDB 修改操做符(修改器)

修改的時候必需要使用修改器

若是用較老的 update 方法 確實能夠不使用修改器, 可是實現效果是替換很不理想

本意想 查找 名字 yy 的文檔,將 age 改成 99 
>
db.class.update({name:"yy"},{age:99}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前: { "name" : "yy", "age" : 88 }
修改後: { "age" : 99 }

$set

修改一個域, 或者增長一個域

查找 age 爲 99 的文檔, 將名字 改成 yy
>
db.class.update({age:99},{$set:{name:"yy"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前:{ "age" : 99}
修改後:{ "age" : 99, "name" : "yy" }

$unset

刪除一個域

ps:

官方推薦 選定被刪除域的時候值用 "" 空便可,當前其實隨便字符都行,重點是匹配域, 而不是值

去除掉 年齡 99 的文檔中的 age 域
>
db.class.update({age:99},{$unset:{age:""}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改前: { "age" :
99, "name" : "yy" } 修改後: { "age" : 99}

$rename

重命名一個域

將全部的含有 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 }

$inc

加法修改器

讓全部文檔的 年齡 +1 
>
db.class.updateMany({},{$inc:{age:1}}) { "acknowledged" : true, "matchedCount" : 10, "modifiedCount" : 10 }
修改前:  { "name" : "yy" }
修改後:  { "name" : "yy", "age" : 1 }

ps:

  值能夠是正數,負數或者小數

  麼有年齡字段的會產生 age:1 字段

$mul

乘法修改器

用法,參數同加法,只是運算由加法換成乘法

ps:

  怎麼除法? *0.5 = /2

$setOnInsert

當使用 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" }

$max

指定值不低於下限

指定某個域的值若是小於該值則修改成該值, 大於則不變

指定 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" }

$min

指定值不低於上限

用法同 $max 控制最大值不超過設定值,大於了就改爲設定值

mongoDB 數組修改器

$push

向數組中添加一項

查找 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" }

$pushAll

向數組中添加多項

查找 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" }

$pull

從數組中刪除一個值,若是有重複的值, 會所有刪除

查找 名字 爲 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" }

$pullAll

從數組中刪除多個值、若是有重複的值, 會所有刪除

刪除的時候也能夠按照條件刪除

查找 名字 爲 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" }

$pop

彈出數組中一項

只能彈出兩頭的第一個內容

  取值 爲 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" ] }

$addToSet

向數組中添加一項

不能和已有值重複

若是是重複值則不作任何操做

查找 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 ] }

$each

對多個值逐一操做

查找 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 ] }

$position

指定位置插入

須要配合 $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 ] }

$sort

對數組排序

搭配 $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] }
相關文章
相關標籤/搜索