更新文檔(update)

圖片.png



修改一條簡單文檔:

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

圖片.png(其他數據條的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": "某海"
        }
    }
);

圖片.png

(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>)裏不能有更新操作符。

圖片.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章