首页 > Mongodb > Mongo update详解

Mongo update详解

2015年3月9日 发表评论 阅读评论

 

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.查询JOBANALYST的员工工资

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


 

分类: Mongodb 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.