修改一条简单文档:
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 :
db.collection.updateMany()。与update()唯一的区别是命令语法里少了一个multi: db.collection.replaceOne()。与update()的区别有两处,一个没有multi: 另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
文章标题:更新文档(update)-创新互联
文章路径:http://cdxtjz.cn/article/dsphec.html