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 }
>