暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

NoSQL学习笔记--MongoDB基本操作(更新)

张春光的一亩三分地 2018-06-28
461

MongoDB数据库实例建立后,就可以对数据库进行各种操作了,比如插入,更新,删除,查询,索引,聚合,复制,分片等等

1、插入文档

2、查询文档

3、更新文档

对于集合里插入的文档,如需要修改,则要使用MongoDB提供的文档更新命令

语法:

db.collection.update(

<query>,    //update的查询条件

<uodate>,   //更新对象文档,含操作符功能实用

//下面参数可选

{upsert:<boolean>

multi:<boolean>

writeConcern:<document>,

collation:<document> //3.4版本新增参数

}

)

update命令在集合里更新一条或者多条文档记录

db是数据库,collection是集合名,update是更新命令

update命令参数如下:

query:update的查询条件,类似SQL中update查询where子句后面的条件

update:update的更新对象和一些更新的操作符,可以理解为SQL中update查询set子句后面的更新内容

upsert:可选;如果不存在update的记录,是否插入objNew:true为插入,false为不插入,默认为false

multi:可选;MongoDB默认为false,只更新找到的第一条记录;如果这个参数为true,就把按条件查出来的多条记录全部更新

writeConcern:可选;自定义写出错确认级别

collation:可选;指定特定国家语言的更新归类规则

返回值:

更新成功,返回WriteResult({nUpdated:n})对象;更新失败,返回结果中包含WriteResult.writeConcernError对象字段内容

实例:

修改一条简单文档

> use goodsdb

switched to db goodsdb

> db.order.insert(

... {title:"商品购物单1"

... ,amount:35,

... detail:[{name:"苹果",price:22},{name:"面粉",price:18}]

... }

... )

WriteResult({ "nInserted" : 1 })

//先插入一条文档

> db.order.update({title:"商品购物单1"},{$set:{title:"商品购物单2"}}) 

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

//改订单名称

> db.order.find().pretty()

{

       "_id" : ObjectId("5b2f5f2971002a5e7511e8be"),

       "title" : "商品购物单2",

       "amount" : 35,

       "detail" : [

               {

                       "name" : "苹果",

                       "price" : 22

               },

               {

                       "name" : "面粉",

                       "price" : 18

               }

        ]

}

//验证修改是否成功

 

修改数值做加法运算可以用$inc操作符可以是正数负数或者小数

> db.order.find().pretty()

{

       "_id" : ObjectId("5b32fed35ae81fb5335bceb9"),

       "title" : "商品购物单2",

       "amount" : 35,

       "detail" : [

               {

                       "name" : "苹果",

                       "price" : 22

               },

               {

                       "name" : "面粉",

                       "price" : 18

               }

        ]

}

> db.order.update(

... {

... title:"商品购物单1"

... },

... {

... $inc:{amount:5}

... }

... )

WriteResult({ "nMatched" : 0,"nUpserted" : 0, "nModified" : 0 })

//没找到匹配

> db.order.update(

... {

... title:"商品购物单2"

... },

... {

... $inc:{amount:5}

... }

... )

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

//匹配并更新一行

> db.order.find().pretty()

{

       "_id" : ObjectId("5b32fed35ae81fb5335bceb9"),

       "title" : "商品购物单2",

       "amount" : 40,

       "detail" : [

//更新成功

 

修改数值做乘法运算可以用$mul操作符可以是正数负数或者小数

> db.order.update(

... {

... title:"商品购物单2"

... },

... {

... $mul:{amount:2}

... }

... )

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

//匹配并更新一行

 

> db.order.find().pretty()

{

       "_id" : ObjectId("5b32fed35ae81fb5335bceb9"),

       "title" : "商品购物单2",

       "amount" : 80,

 

修改错误字段的键值可以用$rename操作符

> db.order.insert(

... {titse:"商品购物单3",

... amount:50,

... detail:[{name:"苹果",price:32},{name:"面粉",price:18}]

... }

... )

WriteResult({ "nInserted" : 1 })

> db.order.find().pretty()

{

       "_id" : ObjectId("5b3301055ae81fb5335bceba"),

       "titse" : "商品购物单3",

       "amount" : 50,

       "detail" : [

               {

                       "name" : "苹果",

                       "price" : 32

               },

               {

                       "name" : "面粉",

                       "price" : 18

               }

        ]

}

> db.order.update(

... {

... _id:ObjectId("5b3301055ae81fb5335bceba")

... },

... {

... $rename:{"titse":"title"}

... }

... )

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

//匹配并更新一行

> db.order.find().pretty()

{

       "_id" : ObjectId("5b3301055ae81fb5335bceba"),

       "amount" : 50,

       "detail" : [

        ],

       "title" : "商品购物单3"

}

删除一个字段可以用$unset操作符

> db.order.insert(

... {

... _id:10,

... titse:"商品购物单3",

... amount:50,

... unit:"",

... detail:[{name:"苹果",price:32},{name:"面粉",price:18}]

... }

... )

WriteResult({ "nInserted" : 1 })

> db.order.find({_id:10}).pretty()

{

       "_id" : 10,

       "titse" : "商品购物单3",

       "amount" : 50,

       "unit" : "",

       "detail" : [

        ]

}

 

> db.order.update(

... {

...  _id:10

... },

... {

... $unset:{unit:""}

... }

... )

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

//匹配并更新一行

> db.order.find({_id:10}).pretty()

{

       "_id" : 10,

       "titse" : "商品购物单3",

       "amount" : 50,

       "detail" : [

        ]

}

 

$min给出的值与当前文档字段值进行比较当给定值较小时则修改文档值为给定值

> db.order.update(

... {

...  _id:10

... },

... {

... $min:{amount:49}

... }

... )

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

//匹配并更新一行

 

> db.order.find({_id:10}).pretty()

{

       "_id" : 10,

       "titse" : "商品购物单3",

       "amount" : 49,

       "detail" : [

        ]

}

$max给出的值与当前文档字段值进行比较当给定值较大时则修改文档值为给定值

> db.order.update(

... {

...  _id:10

... },

... {

... $max:{amount:50}

... }

... )

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

//匹配并更新一行

 

> db.order.find({_id:10}).pretty()

{

       "_id" : 10,

       "titse" : "商品购物单3",

       "amount" : 50,

       "detail" : [

        ]

}

ISODate更新当前文档时间字段值

> db.order.insert(

... {

... _id:15,

... titse:"商品购物单4",

... amount:50,

... unit:"",

... detail:[

... {name:"苹果",price:32},{name:"面粉",price:18}

... ],

... lasttime:ISODate("2018-06-26 11:16:33")//注意格式写成2018-6-26通不过

... }

... )

WriteResult({ "nInserted" : 1 })

> db.order.find({_id:15}).pretty()

{

       "_id" : 15,

       "titse" : "商品购物单4",

       "amount" : 50,

       "unit" : "",

       "detail" : [

        ],

       "lasttime" : ISODate("2018-06-26T11:16:33Z")

}

> db.order.update(

... {

...  _id:15

... },

... {

... lasttime:ISODate("2018-05-26 11:16:33")

... }

... )

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

//匹配并更新一行

 

> db.order.find({_id:15}).pretty()

{ "_id" : 15, "lasttime" :ISODate("2018-05-26T11:16:33Z") } //注意转换后的ISODate日期格式

修改一条文档里的数组和嵌套文档

对文档中的子文档值进行修改,可以通过主Key.SubKey的组合来实现指定子文档字段对应值的修改

对于数组的修改,可以通过Key.Number的方式指定修改数组值,number从0,1....开始,对应数据的第一个下标,第二个下标....

> db.order.insert(

... {

... _id:16,

... titse:"商品购物单6",

... amount:90,

... unit:"元",

... detail:[

... {name:"苹果",price:32},{name:"葡萄",price:18},{name:"香蕉",price:40}

... ],

... lasttime:ISODate("2018-06-2611:16:33"),

... overview:{shop:"Micky商务平台",shopno:8,address:"李菜园村"}

... }

... )

WriteResult({ "nInserted" : 1 })

> db.order.find({_id:16}).pretty()

{

       "_id" : 16,

       "titse" : "商品购物单6",

       "amount" : 90,

       "unit" : "元",

       "detail" : [

               {

               {

                        "name" :"香蕉",

                        "price" : 40

               }

        ],

       "lasttime" : ISODate("2018-06-26T11:16:33Z"),

       "overview" : {

               "shop" : "Micky商务平台",

               "shopno" : 8,

               "address" : "李菜园村"

        }

}

> db.order.update(

... {

...  _id:16

... },

... {

... $set:{

... "detail.2":{name:"大米",price:50},//数组更新,MongoDB数组下标从0开始,detail.2代表数组第三个元素

... "overview.address":"上海市浦东新区博兴路799弄"  //子文档更新,引用数组或者嵌入文档对象时,都需要加上""号,中间用.点号隔离。

... }

... }

... )

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.order.find({_id:16}).pretty()

{

       "_id" : 16,

        "titse" : "商品购物单6",

       "amount" : 90,

       "unit" : "",

       "detail" : [

               {

                       "name" : "大米",

                       "price" : 50

               }

        ],

       "lasttime" : ISODate("2018-06-26T11:16:33Z"),

       "overview" : {

               "shop" : "Micky商务平台",

               "shopno" : 8,

               "address" : "上海市浦东新区博兴路799"

        }

}

多文档修改

默认情况下update命令执行修改一条文档如果想一次修改多条文档记录可以加multi选项

> db.order.find().pretty() //查询当前值

{

       "_id" : ObjectId("5b32fed35ae81fb5335bceb9"),

       "title" : "商品购物单2",

       "amount" : 80,

       "detail" : [

               {

                       "name" : "苹果",

                       "price" : 22

               },

        ]

}

{

       "_id" : ObjectId("5b3301055ae81fb5335bceba"),

       "amount" : 50,

       "detail" : [

               {

                       "name" : "苹果",

                       "price" : 32

               },

               {

                       "name" : "面粉",

                       "price" : 18

               }

        ],

       "title" : "商品购物单3"

}

{

       "_id" : 10,

       "titse" : "商品购物单3",

       "amount" : 50,

       "detail" : [

               {

                       "name" : "苹果",

                       "price" : 32

               },

        ]

}

{

       "_id" : 11,

       "titse" : "商品购物单4",

       "amount" : 50,

       "unit" : "",

       "detail" : [

               {

                       "name" : "苹果",

                       "price" : 32

               },

        ],

       "lasttime" : ISODate("2016-11-28T11:16:33.303Z")

}

{

       "_id" : 12,

       "titse" : "商品购物单4",

       "amount" : 50,

       "unit" : "",

       "detail" : [

               {

                       "name" : "苹果",

                       "price" : 32

               },

        ],

       "lasttime" : ISODate("2016-11-28T11:16:33.303Z")

}

{

       "_id" : 13,

       "titse" : "商品购物单4",

       "amount" : 50,

       "unit" : "",

       "detail" : [

               {

                       "name" : "苹果",

                       "price" : 32

               },

        ],

       "lasttime" : ISODate("2018-06-26T11:16:33.303Z")

}

{ "_id" : 15, "lasttime" :ISODate("2018-05-26T11:16:33Z") }

{

       "_id" : 16,

       "titse" : "商品购物单6",

       "amount" : 90,

       "unit" : "",

       "detail" : [

               {

                       "name" : "苹果",

                        "price" : 32

               },

               {

                       "name" : "葡萄",

                       "price" : 18

               },

        ],

       "lasttime" : ISODate("2018-06-26T11:16:33Z"),

       "overview" : {

               "shop" : "Micky商务平台",

               "shopno" : 8,

               "address" : "上海市浦东新区博兴路799"

        }

}

> db.order.update(

... {

... "detail.name":"苹果","detail.price":{$lte:40}

... },

... {

... $set:{

... "detail.0":{name:"苹果",price:45},//价格小于等于40的改为45

... }

... },

... {

... multi:true

... }

... )

WriteResult({ "nMatched" : 7,"nUpserted" : 0, "nModified" : 7 })

//7条文档被修改结果如下

> db.order.find().pretty()

{

       "_id" : ObjectId("5b32fed35ae81fb5335bceb9"),

       "title" : "商品购物单2",

       "amount" : 80,

       "detail" : [

               {

                        "name" : "苹果",

                       "price" : 45

               },

               {

                       "name" : "面粉",

                       "price" : 18

               }

        ]

}

{

       "_id" : ObjectId("5b3301055ae81fb5335bceba"),

       "amount" : 50,

       "detail" : [

               {

                       "name" : "苹果",

                       "price" : 45

               },

               {

                       "name" : "面粉",

                       "price" : 18

               }

        ],

       "title" : "商品购物单3"

}

{

       "_id" : 10,

       "titse" : "商品购物单3",

       "amount" : 50,

       "detail" : [

               {

                       "name" : "苹果",

                       "price" : 45

                },

               {

                       "name" : "面粉",

                       "price" : 18

               }

        ]

}

{

       "_id" : 11,

       "titse" : "商品购物单4",

       "amount" : 50,

       "unit" : "",

       "detail" : [

               {

                       "name" : "苹果",

                       "price" : 45

               },

               {

                       "name" : "面粉",

                       "price" : 18

               }

        ],

       "lasttime" : ISODate("2016-11-28T11:16:33.303Z")

}

{

       "_id" : 12,

       "titse" : "商品购物单4",

       "amount" : 50,

       "unit" : "",

       "detail" : [

               {

                       "name" : "苹果",

                       "price" : 45

                },

               {

                       "name" : "面粉",

                       "price" : 18

               }

        ],

       "lasttime" : ISODate("2016-11-28T11:16:33.303Z")

}

{

       "_id" : 13,

       "titse" : "商品购物单4",

       "amount" : 50,

       "unit" : "",

       "detail" : [

               {

                       "name" : "苹果",

                       "price" : 45

               },

               {

                       "name" : "面粉",

                       "price" : 18

               }

        ],

       "lasttime" : ISODate("2018-06-26T11:16:33.303Z")

}

{ "_id" : 15, "lasttime" :ISODate("2018-05-26T11:16:33Z") }

{

       "_id" : 16,

       "titse" : "商品购物单6",

       "amount" : 90,

       "unit" : "",

       "detail" : [

               {

                       "name" : "苹果",

                       "price" : 45

               },

        ],

       "lasttime" : ISODate("2018-06-26T11:16:33Z"),

       "overview" : {

               "shop" : "Micky商务平台",

               "shopno" : 8,

               "address" : "上海市浦东新区博兴路799"

        }

}

 

增加文档字段

update命令在特定的情况下可以增加文档字段甚至实现insert的命令功能。这个特定条件是要修改的文档没有要修改的字段,而且update带有upsert选项

> db.order.insert(

... {

... _id:17,

... titse:"商品购物单7",

... amount:50,

... detail:[

... {name:"苹果",price:12},{name:"葡萄",price:18},{name:"西瓜",price:20}

... ],

... lasttime:ISODate("2018-06-2613:16:33"),

... overview:{shop:"Micky商务平台",shopno:8,address:"李菜园村"}

... }

... )

WriteResult({ "nInserted" : 1 })

> db.order.update(

... {

...  _id:17

... },

... {

... $set:{

... "detail.2":{name:"西瓜",price:18},unit:""

... }

... },

... {

... upsert:true

... }

... )

WriteResult({ "nMatched" : 1,"nUpserted" : 0, "nModified" : 1 })

> db.order.find({_id:17}).pretty()

{

       "_id" : 17,

       "titse" : "商品购物单7",

       "amount" : 50,

       "detail" : [

               {

                       "name" : "西瓜",    //修改西瓜价格为18

                       "price" : 18

               }

        ],

       "lasttime" : ISODate("2018-06-26T13:16:33Z"),

       "overview" : {

               "shop" : "Micky商务平台",

               "shopno" : 8,

               "address" : "李菜园村"

        },

       "unit" : ""       //新增字段

}

自定义写确认级别

writeConcern选项为update修改数据异常时提供出错处理机制

db.order.update(

{

 item:""

},

{

$set:{

title:"Test",price:50

}

},

{

multi:true,

writeConcern:{w:"majority",wtimeout:5000}   //update命令在5秒内没有完成执行取消该命令执行并返回错误值

}

)

 

collation参数使用

语法

collation:{

   locale:<string>,

   caseLevel:<boolean>,

   caseFirst:<string>,

   strength:<int>,

  numericOrdering: <boolean>,

   alternate:<string>,

   maxVariable:<string>,

   backwards:<boolean>,

   normalization<boolean>

}

参数说明更新规则参数允许程序员为字符串比较指定特定国家语言的规则如字母大小写重音标记等。

   locale:<string>说明:<"zh">中文如用来比较汉字默认不填写或者填写simple为二进制简单字符串比较。

   caseLevel:<boolean>说明:<false>,默认为该值表示不进行大小比较;<true>,基本字符串比较大小写读音符等比较showstrength控制

   caseFirst:<string>说明大有大小写字母时确定小写的排在前面还是大写的排在前面;<"upper">大写排在前面;<"lower">小写排在前面;<"off">默认值接近于lower有些许差异。

   strength: <int>说明:<1>表示只进行基本字符比较;<2>表示先进行字符比较,再根据差异对读音符进行比较;<3>表示先进行字符比较,再根据差异对读音符进行比较,最后才根据差异对大小写和字母辩题进行比较,这是默认级别;<4>处理特定用例,如需要考虑标点符号或者处理日语时使用;<5>限于中断器的特殊用途。

   numericOrdering: <boolean>说明:确定是否比较字符串里的数字;<true>,10比2大等数值比较;<false>,10比2小,采用ASCII码位比较。

  alternate: <string>说明:<"non-ignorable">空格和标点符号都被认为是基本符号,参与比较。默认参数;<"shifted">空格和标点符号不被认为是基本符号,并且strength:值为4或5时该设置才执行该参数。

  maxVariable: <string>说明:<"punct">空格和标点符号被忽略;<"space">空格被忽略。若alternate设置了non-ignorable,则这里的所有设置被忽略;若alternate设置为shifted,则决定那部分被忽略。

  backwards: <boolean>说明:确定有读音符的字符串是否从字符串后面排序的标志,例如使用一些语法字典排序:<true>从后向前进行比较;<false>从前向后进行比较,默认值。

  normalization <boolean>说明:是否需要对文档的文本进行标准化检查,一般来说大多数文本不需要归一化处理。<false>不检查,默认值;<true>检查是否完全规范化。

三个新的修改简化命令

1、db.collection.updateOne():只适用于符合条件的一条文档的修改任务

2、db.collection.updateMany():只适用于符合条件的多条文档的修改任务

3、db.collection.replaceOne():与update()区别有两处,一个是没有multi:<boolean>选项;二是在第二个参数(update的<uodate>)里不能有更新操作符,例如:

db.order.replaceOne(

{

_id:11

},

{

$inc:{amount:5} //使用操作符不允许,会报错

}

)

执行结果如下:

> db.order.replaceOne(

... {

... _id:11

... },

... {

... $inc:{amount:5}

... }

... )

2018-06-28T13:53:52.020+0800 E QUERY    [thread1] Error: the replace operation d

ocument must not contain atomic operators :

DBCollection.prototype.replaceOne@src/mongo/shell/crud_api.js:463:1

@(shell):1:1

如下可以:

> db.order.replaceOne(

... {

... _id:11

... },

... {

... amount:55

... }

... )

{ "acknowledged" : true,"matchedCount" : 1, "modifiedCount" : 1 }

 

> db.order.find({_id:11}).pretty()

{ "_id" : 11, "amount" : 55 }

>


文章转载自张春光的一亩三分地,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论