一、引言
上一篇文章我们已经详细介绍了MongoDB数据库的有关查询的内容,但是这只是所有查询命令的冰山一角。所有查询命令都写完也没有必要,我只是写了一些常用的命令,对MongoDB的操作有一个基本的认识,如果大家想继续深入,可以根据自己的需要深入学习其他的命令。今天要讲一些和更新、修改有关系的语句、命令或者方法,当然不可能是所有的命令了,也只是一些常用的命令。我提供给大家一个基础,大家可以继续深入,我也会继续深入学习的。废话不多说,马上开始我们今天的写作吧。
二、MongoDB有关修改的详解
我比较直接,还是直接来内容吧,有关修改的每个方法都有示例代码,应该不是很难,希望能起到抛砖引玉的作用吧。
1、update() 方法
1.1、update() 方法用于更新已存在的文档。语法格式如下:
db.collectionName.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
参数说明:
query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如$set,$inc...)等,也可以理解为sql update查询内set后面的
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入新的文档,true为插入,默认是false,不插入。
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern :可选,抛出异常的级别。
1.2、示例代码
> db.students.find({"name":FangShiYu"}) { _id" : ObjectId(5ab9de223afa6504457050e2")," : ",1)">age22,1)">sex1,1)">schoolZheJiangDaXueaddressGuangDongGuangZhou } //修改【name】是【FangShiYu】的【age】字段的值为【25】 > db.students.update({"},{$set":{25}}) WriteResult({ nMatchednUpserted0,1)">nModified1 }) > db.students.find({}) { 25,1)">" }
2、$set 修改器:针对指定字段设置指定的值,修改字段的值
语法:db.collectionName.update({query},{"$set":{<key>:<value>}})
参数说明:
query:查询条件
key:要操作的字段名
value:要给key字段赋的值
在MongoDB数据库中通过 $set 修改器和 update()方法配合使用,起到修改指定字段的作用。
2.1、示例代码:
> db.students.find({ }
>
2、$inc 修改器:在数值字段在原有的基础上再增加指定的数值,其值可以是正数,也可以是负数,负数是减多少
语法:db.collectionName.update({query},{"$inc":{<key>:number}})
参数说明:
query:查询条件
key:要操作的字段名
number:增加的数量,可以是正数也可以是负数,正数相加,负数相减
在MongoDB数据库中通过 $inc 修改器和 update()方法配合使用,起到让数值字段在原有的基础上增加指定的数值的作用。
2.1、示例代码:【age】字段在原有基础上加 【正数:1】
> db.students.find({ } 修改【name】是【FangShiYu】的【age】字段的值,让其值增加1,最受值为【26】 > db.students.update({$inc}}) WriteResult({ }) > db.students.find({}) { 26,1)"> } >
2.2、示例代码:【age】字段在原有基础上加 【负数:-5】
> db.students.find({ } > db.students.update({":-521,1)"> } >
3、$push 修改器:针对指定的字段插入文档列表,如果该字段不存在,会建立该字段并插入内文档容,如果存在,就向该字段的列表里追加文档内容。例如:留言板
documents={document}
语法:db.collectionName.update({query},{"$push":{<key>:document}})
参数说明:
query:查询条件
document:一个文档对象
key:要操作的字段名
在MongoDB数据库中通过 $push 修改器和 update()方法配合使用,起到留言板的效果,比如:多个人可以给某一个女生留言,每条留言就是一个文档,多个文档组成列表
2.1、示例代码:【messages】集合中原来没有【comments】字段
原始记录 > db.messages.find() { 5abdc29b678c8239350e8a20peny0 } > query={tomsayi love u!} { } > db.messages.update({$pushcomments:query}}) WriteResult({ }) 网【messages】集合中增加了【comments】字段,并增加了一个列表,也可以说数组 >" : [ { } ] } >
2.2、示例代码:在【messages】集合基础上继续向【comments】字段追加文档内容
db.messages.find() { } ] } > query={jimi want to know you!} { } > db.messages.update({:query}}) WriteResult({ }) >" },{ } ] } >
4、$each 修改器: $each 修改器、$push 修改器必须组合使用,可以一次增加由多个文档组成的列表,字段有,就追加文档,没有就创建该字段并增加一个由多个文档组成的列表数据
documents=[{document1},{document2},{document3}....{documentn}]
语法:db.collectionName.update({query},{"$push":{<key>:{"$each":documents}}})
参数说明:
query:查询条件
documents:文档列表,也可以称文档数组
key:要操作的字段名
在MongoDB数据库中通过 $each 修改器、$push 修改器 和 update()方法配合使用,起到的作用类似一次插入由多个文档组成的列表。
5abdc844678c8239350e8a21 }
>query=[{hello!jackeyjerryi want u}];
[
{
,
},{
}
]
> db.messages.update({$each:query}}})
WriteResult({ })
> 2.2、示例代码:在【messages】集合基础上继续向【comments】字段追加文档内容
} ] } > query=[{jasoni know you!bobi miss you!}]; [ { } ] > db.messages.update({:query}}}) WriteResult({ }) 追加了文档数据 > } ] } >
5、$slice 修改器:控制记录保存的条数,如果以前有多条会把以前的清空保存条件所规定的记录,如果操作的字段不存在,就会创建该字段
documents=[{document1},{$push:{<key>:{$each:documents,$slice:number}}})
参数说明:
query:查询条件
documents:文档列表,也可以称文档数组
key:要操作的字段名
number:控制显示的数量,正数保留最早的number条记录,负数保留最新的number条记录
2.1、示例代码:【messages】集合中原来没有【comments】字段
5abdceca678c8239350e8a2218,1)"> } > var query=[{lileihellohanmeimeii miss ui watch umonsterghost}]; 保存最早的两条记录,也就是【name】分别是:lilei和hanmeimei > db.messages.update({":{$each:query,$slice:2}}}) WriteResult({ }) > } ] } >
2.2、示例代码:在【messages】集合基础上向【comments】字段文档内容
} ] } > }]; 只会保留最新的记录,也就是【name】的值是:monster的文档 > db.messages.update({}}}) WriteResult({ " : - }) >" : [ {}] } >
6、$addToSet 修改器:当插入一个数组时,如果数组中有重复记录,只会直插入一条,不会重复插入,会过滤掉重复的记录
documents=[{document1},{document3}...{documentn}]
语法:db.collectionName.update({query},{"$addToSet":{<key>:{"$each":documents}}})
参数说明:
query:查询条件
documents:要插入的文档数组,也可以称作是列表,其中可以包含重复的文档
<key>:表示要插入数组列表的字段
代码实例:
原始数据 > db.messages.find() { 5ac5b03525eb395526dc108d0 } 定义要插入的文档数组,里面有重复记录,只有最后一个文档不同 > var documents=[{hi}]; 执行更新成功 > db.messages.update({$addToSet:documents}}}); WriteResult({ }) 查询结果,值插入两条记录 > } ] } >
7、$pop修改器【删除】:从数组中进行向前删除或者向后删除,+1正数表示从尾部开始删除,-1负数表示从头开始删除。
语法:db.collectionName.update({query},{"$pop":{<key>:1(从后开始删除)/-1(从头开始删除)}})
参数说明:
query:查询条件
<key>:表示要执行删除操作的字段名,该字段必须是数组字段
1(从后开始删除)/-1(从头开始删除),只能是数字1和-1,其他值非法
代码实例:
db.messages.find() { hi1hi2hi3hello5 } ] } 执行删除操作,并且执行成功 > db.messages.update({$pop}}) WriteResult({ }) 执行结果,把comments数组的第一个元素删除了 >" } ] }
8、$pull修改器【删除】:根据指定条件删除数组字段里面的指定文档数据,pop只能删除头部或者尾部的数据
语法:db.collectionName.update({query},{"$pull":{<key>:{query2}}})
参数说明:
query:查询条件
documents:要插入的文档数组,也可以称作是列表,其中可以包含重复的文档
<key>:表示要执行删除操作的字段名,该字段必须是数组字段
query2:查询数组字段中指定文档数据的查询条件
} ] }
执行删除操作,并且执行成功
> db.messages.update({$pull}}})
WriteResult({ 结果数据,已经删除了说话内容是“hi2”的文档
>" } ] }