您好,登錄后才能下訂單哦!
修改一條簡單文檔:
db.getCollection("test").insert( ????{ ????????title:?"商品購物單1", ????????amount:?35, ????????detail:?[ ????????????{name:?"蘋果",?price:?22}, ????????????{name:?"面粉",?price:?18} ????????] ????} ); //修改符合條件的一條(插入的,符合條件的最早一條) db.getCollection("test").update( ????{ ????????title:?"商品購物單1" ????}, ????{ ????????$set:?{title:?"商品購物單2"} ????} );
(update,修改符合條件的一條(插入的,符合條件的最早一條))
更新字段(增加,減少):
db.getCollection("test").update( ????{ ????????title:?"商品購物單1" ????}, ????{ ????????$inc:?{"amount":?5} ????} );
(update,修改符合條件的一條(插入的,符合條件的最早一條)。$inc操作符后面的值,可以是正數、負數,也可以是小數)
改為指定倍數:
db.getCollection("test").update( ????{ ????????title:?"商品購物單1" ????}, ????{ ????????$mul:?{"amount":?2} ????} );
(update,修改符合條件的一條(插入的,符合條件的最早一條)。$mul操作符后面的值,可以是正數、負數,也可以是小數)
更新字段/鍵名
db.getCollection("test").insert( ????{ ????????_id:?66, ????????titlss:?35, ????????amount:?50.5, ????????detail:?[ ????????????{name:?"蘋果",?price:?22}, ????????????{name:?"面粉",?price:?18} ????????] ????} ); db.getCollection("test").update( ????{ ????????_id:?66 ????}, ????{ ????????$rename:?{"titlss":?"title"} ????} );
($rename 操作符。在鍵名大量出錯的情況下尤其有用)
將_id為66,title為35的這一列去掉(其他數據條的title不變)
db.getCollection("test").update( ????{ ????????_id:?66 ????}, ????{ ????????$unset:?{"title":?"35"} ????} );
(其他數據條的title不變,title為35的變為N/A)
_id:66文檔的amount由50.5修改為50:
db.getCollection("test").update( ????{ ????????_id:?66 ????}, ????{ ????????$unset:?{"title":?"35"} ????} );
(將$min給出的值與當前文檔字段值進行比較,當給定值較小時則修改當前文檔值為給定值)
_id:66文檔的amount由50修改為50.5:
db.getCollection("test").update( ????{ ????????_id:?66 ????}, ????{ ????????$max:?{"amount":?50.5} ????} );
(將$max 給出的值與當前文檔字段值進行比較,當給定值較大時則修改當前文檔值為給定值)
ISODate時間方法:
db.getCollection("test").insert( ????{ ????????_id:?69, ????????title:?"商品購物單6", ????????amount:?80, ????????unit:?"元", ????????detail:?[ ????????????{name:?"蘋果",?price:?22}, ????????????{name:?"面粉",?price:?18} ????????], ????????lasttime:?ISODate("2018-07-21?14:53:56") ????} );
修改一條文檔里的數組和嵌套文檔:
db.getCollection("test").insert( ????{ ????????_id:?80, ????????title:?"商品購物單80", ????????amount:?80, ????????unit:?"元", ????????detail:?[ ????????????{name:?"蘋果",?price:?22}, ????????????{name:?"面粉",?price:?18} ????????], ????????lasttime:?ISODate("2018-07-21?14:53:56"), ????????overview:?{shop:?"丁丁電子商務平臺",?shopno:?5,?address:"地球村"} ????} );
db.getCollection("test").update( ????{ ????????_id:?80 ????}, ????{ ????????$set:?{ ????????????"detail.1":?{name:?"大米",?price:?16}, ????????????"overview.address":?"某海" ????????} ????} );
(MongoDB數組下標從0開始,"detail.1"代表數組第2個元素)
(引用數組或嵌入文檔對象時,都需要加""號,如"detail.1","overview.address",中間用點號隔離)
修改數組的內容,要有
默認情況下update命令都執行修改一條文檔動作,我們也希望能同時修改所有符合條件的文檔記錄,這里需要采用multi選項:
db.getCollection("test").update( ????{ ????????"detail.name":?"面粉", ????????"detail.price":?{$lte:?30} ????}, ????{ ????????$set:?{ ????????????"detail.1":?{name:?"面粉",?price:?666}, ????????????"overview.address":?"這里" ????????} ????}, ????{ ????????multi:?true ????} );
(將面粉價格小于等于30的記錄的detail數組第二個(下標為1)的面粉價格改為40)
find()查詢條件操作符,可以用在update操作條件上
db.getCollection("test").update( ????{ ????????"detail.name":"面粉",?"detail.price":?{$lte:?30} ????}, ????{ ????????$set:?{ ????????????"detail.1":?{name:"面粉",?price:40} ????????} ????}, ????{ ????????multi:?true?//滿足條件的都修改 ????} );
Update命令在特定情況下,可以增加文檔的宇段,甚至實現insert命令功能。這個特定條件是要修改的文檔沒有要修改的字段,而且update命令帶upsert選項
db.getCollection("test").update( ????{ ????????_id:?80 ????}, ????{ ????????$set:?{ ????????????"detail.1":?{name:"面粉",?price:10},?//修改后的 ????????????danwei:?"美元"?//新增加字段 ????????} ????}, ????{ ????????upsert:?true ????} );
writeConcern選項為update修改數據異常時,提供出錯處理機制
db.getCollection("test").update( ????{ ????????item:?"" ????}, ????{ ????????$set:?{ ????????????title:?"測試",?price:?50 ????????} ????}, ????{ ????????multi:?true, ????????writeconcern:?{w:?"majority",?wtimeout:3000} ????} );
(當update命令在5秒內沒有執行完成時,取消該命令操作,并返回錯誤值)
db.collection.updateOne()。與update()唯一的區別是命令語法里少了一個multi :<boolean>選項, 也就是updateOne()只適用于符合條件的一條文檔的修改任務。
db.collection.updateMany()。與update()唯一的區別是命令語法里少了一個multi:<boolean>選項, 也就是updateMany()只適用于符合條件的多條文檔的修改任務。
db.collection.replaceOne()。與update()的區別有兩處,一個沒有multi:<boolean>選項;另外一個在第二個參數Cupdate的<update>)里不能有更新操作符。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。