Mongo update详解
Contents
1. 替换更新
将员工编号是7902的员工工资有300更新成500
> var infos=db.emp.findOne({"EMPNO" : 7902});
> infos.SAL 3000
> infos.SAL=500
500
> db.emp.update({"EMPNO" : 7902}, infos)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.emp.findOne({"EMPNO" : 7902})
{ "_id" : ObjectId("54f3b29ccc2f0a163b5a9214"), "EMPNO" : 7902, "ENAME" : "FORD", "JOB" : "ANALYST", "MGR" : 7566, "HIREDATE" : "1981/12/3", "SAL" : 500, "COMM" : "", "DEPTNO" : 20 }
2.使用标识符更新
update()函数可以接受两个参数,第一个是查询条件,查询符合更新条件的数据,第二个参数是更新列。
2.1 $inc
将员工编号是7902的员工工资增加200
> db.emp.update({"EMPNO" : 7902},{$inc:{"SAL":200}})
注意需要修改的列必须是数值类型,否则会报错
> db.emp.update({"EMPNO" : 7902},{$inc:{"JOB":200}}) WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0, "writeError" : { "code" : 16837, "errmsg" : "Cannot apply $inc to a value of non-numeric type. {_id: ObjectId('54f3b29ccc2f0a163b5a9214')} has the field 'JOB' of non-numeric type String" } })
2.2 $set
将员工编号是7902的员工工资设置成2000
> db.emp.update({"EMPNO" : 7902},{$set:{"SAL":2000}})
如果更新的列不存在则直接增加新列而不会报错
2.3 $unset
删除列COMM
db.emp.update({"EMPNO" : 7902},{$unset:{"COMM":1}})
2.4 $push
$push属于数组操作,可以将一个元素添加到一个数据列中,如果该类不是数组类型,会自动转换成数组类型
> db.emp.update({"EMPNO" : 7902},{$push:{"COMM":"a"}}) > db.emp.update({"EMPNO" : 7902},{$push:{"COMM":"b"}})
验证结果:
> db.emp.find({"EMPNO" : 7902},{"_id":0}) { "EMPNO" : 7902, "ENAME" : "FORD", "JOB" : "ANALYST", "MGR" : 7566, "HIREDATE" : "1981/12/33", "SAL" : 2000, "DEPTNO" : 20, "COMM" : [ "a", "b" ] }
2.5 $each
使用$each标识符可以同时添加多个数组元素
> db.emp.update({"EMPNO" : 7902},{$push:{"COMM" : {$each : ["c","d","e","f"]}}})
验证结果
> db.emp.find({"EMPNO" : 7902},{"_id":0}) { "EMPNO" : 7902, "ENAME" : "FORD", "JOB" : "ANALYST", "MGR" : 7566, "HIREDATE" : "1981/12/33", "SAL" : 2000, "DEPTNO" : 20, "COMM" : [ "a", "b", "c", "d", "e", "f" ] }
2.6 $slice
使用标识符$slice可以在更新时数组控制最大元素个数,在查询时可以限制数组元素的返回个数
> db.emp.update({"EMPNO" : 7902},{$push:{"COMM" : {$each : ["g","h","i","g","k"],$slice:10}}})
验证结果
> db.emp.find({"EMPNO" : 7902},{"_id" :0,"COMM":1}) { "COMM" : [ "a", "b", "c", "d", "e", "f", "g", "h", "i", "g" ] }
COMM数组中只能存储10个元素,超过的会自动丢弃,如果$slice的参数是负数则表示从结尾计算元素的个数,超过最大数的丢弃。
查询COMM数组倒数两个元素:
> db.emp.find({"EMPNO" : 7902},{"_id" : 1,"COMM":{$slice:-2}}) { "_id" : ObjectId("54f3b29ccc2f0a163b5a9214"), "COMM" : [ "i", "g" ] }
2.7 $addToSet
$addToSet操作符和$push都可以向一个数组中添加元素,区别是$addToSet是以集合的方式添加的即只添加数组中不存在的元素,如果数组已存在该元素则自动忽略。
2.8 $pop
标识符$pop用来移除数组的元素,大于等于0的数表示移除最后一个元素,小于0的参数表示移除第一个元素
> db.emp.update({"EMPNO" : 7902},{$pop:{"COMM":2}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.emp.update({"EMPNO" : 7902},{$pop:{"COMM":-2}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.emp.update({"EMPNO" : 7902},{$pop:{"COMM":0}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
验证查询:
> db.emp.find({"EMPNO" : 7902},{"_id" : 0,"COMM": 1 }) { "COMM" : [ "b", "c", "d", "e", "f", "g", "h", "i", "g", "c", "d" ] }
2.9 $pull
$pull可以根据提供的参数进行匹配,能匹配上的就移除
删除数组COMM中所有的d元素
> db.emp.update({"EMPNO" : 7902},{$pull:{"COMM" : "d"}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.emp.find({"EMPNO" : 7902},{"_id" : 0,"COMM" : 1 }) { "COMM" : [ "c", "e", "f", "g", "h", "i", "g", "c" ] }
3.upsert更新
upsert属于一种特殊的更新,如果要更新的数据不存在则更新操作转成插入操作
语法是传入第三个参数值:TRUE
1. 没有员工编号是9999的员工
> db.emp.find({"EMPNO" : 9999}).count() 0
2.更新该员工的信息
> db.emp.update({"EMPNO":9999},{"ENAME":"NEW_NAME","EMPNO":9999},true) WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : ObjectId("54f667c53bb9da0cdac43d4c") })
3.验证结果
> db.emp.find({"EMPNO" : 9999}).count() 1
4.更新所有的匹配数据
默认Mongo数据库只会更新符合查询条件的第一条数据,如果需要更新所有的数据,需要传递第四个参数:TRUE
1.查询JOB是ANALYST的员工工资
> db.emp.find({"JOB" : "ANALYST"},{"_id" : 0,"SAL":1}) { "SAL" : 3000 } { "SAL" : 2000 }
2.每个人的工资涨1000
> db.emp.update({"JOB" : "ANALYST"},{$inc : {"SAL" : 1000}},false,true) WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
发现提示更新了2条数据
3.验证查询
> db.emp.find({"JOB" : "ANALYST"},{"_id" : 0,"SAL":1}) { "SAL" : 4000 } { "SAL" : 3000 }
{ "SAL" : 4000 }
{ "SAL" : 3000 }