修改一條簡單文檔:php
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,修改符合條件的一條(插入的,符合條件的最先一條))
數組
更新字段(增長,減小):ide
db.getCollection("test").update( { title: "商品購物單1" }, { $inc: {"amount": 5} } );
(update,修改符合條件的一條(插入的,符合條件的最先一條)。$inc操做符後面的值,能夠是正數、負數,也能夠是小數)測試
改成指定倍數:spa
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不變)
get
db.getCollection("test").update( { _id: 66 }, { $unset: {"title": "35"} } );
(其餘數據條的title不變,title爲35的變爲N/A)it
_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>)裏不能有更新操做符。