先说一个mongodb与程序(php)相关的问题:
本人在开发的时候,需要根据某条文档的_id来更新对应的文档内容,当我直接使用("57584e289bef19798bd1cab4")类似这样的字符串,直接array("_id"=>"57584e289bef19798bd1cab4"),时,发现更新失败,包括转换成object类型也不行,最后才知道需要使用mongodb里面自带的方法来转换:$id = new MongoId($id),转换后的结果如图:
只有转换成这样,才能被mongodb识别,然后直接array("_id"=>$id)就可以了;
一、mongodb更新文档(主讲update())
mongodb更新文档使用的是update()方法,不过还有有一种方法,那就是save(),虽然save()是插入方法,但是它有一个机制就是它在执行插入前会扫描对应集合中的所有文档,看插入的数据是否存在于集合中,如果存在,则调用mongodb的update()方法,进行更新(覆盖),不存在则插入;
在mongodb中update的语法:
db.collectionName.update({条件},{需要修改的字段和值},{upsert/multiple})
mongodb的update()操作重点在于修改器:
1. $inc :专门用来增加或减少数字的,只能用于整数、长整数和双精度浮点数的值,$inc的键的值必须是数字,不能是数组、字符串或其他非数字的值,如果键不存在,则创建它
语法:db.collectionName.update({条件},{$inc:{field:value}})
php格式:array('$inc'=>array(field=>value))
$inc 相加直接写数字(reward:5),相减(reward:-5),不存在的field直接创建,注意,必须是数字型,不能是数组或字符串等其他非数字的值
2. $set : 用来指定修改某个字段的值,其他字段的值不变,避免覆盖掉整条文档,更新的字段不存在则创建
语法:db.collectionName.update({条件},{$set:{field:value,field2:value2......}})
php格式:array('$set'=>array(field1=>value1,field2=>value2,array_name=>array(1,2,3,4)))
3. $unset : 删除某个field(unset只认识key:value的形式,所以后面的value是什么无所谓,只要它看到key就会unset掉)
语法:db.collectionName.update({条件},{$unset:{field(字段):value(随便)}})
php格式:array('$unset'=>array(field=>value))
数组修改器:
4. $push :如果数组存在,则添加元素到数组尾部,不存在则创建(适用场景举例:一个用户拥有多重身份,多个收货地址,那么就可以将角色id存在一个数组里面,或者将多个收货地址id存在一个数组中)
语法:db.collectionName.update({条件},{$push:{field(该字段是数组):value}})
php格式:array('$push'=>array(arrayName=>value))
5. $pushAll : 跟$push类似,只是可以一次性添加多个元素到某个数组中,不存在则创建
语法:db.collectionName.update({条件},{$pushAll:{arrayName:[元素]}})
php格式:array('$pushAll'=>array(arrayName=>array(value1,value2,value3.......)))
5.1. $push 与 $each 配合也可以一次性添加多个元素到某个数组中
语法:db.collectionName.update({条件},{$push:{arrayName:{$each:[元素]}}})
php格式:array('$push'=>array(arrayName=>array('$each'=>array(value1,value2,value3.......))))
6. $addToSet :添加一个值到数组中,并且只有当这个值不存在在该数组内才添加
语法:db.collectionName.update({条件},{$addToSet :{field:value}})
php格式:array('$addToSet'=>array(arrayName=>value))
7. $pop :删除数组内的一个元素,删除第一个:{$pop:{field:-1}} ,删除最后一个:{$pop:{field:1}}
语法:db.collectionName.update({条件},{$pop:{field:value}})
php格式:array('$pop'=>array(arrayName=>-1/1))
8, $pull : 删除数组中指定的值 {$pull:{field:value}}
语法:db.collectionName.update({条件},{$pull:{field:value}})
php格式:array('$pull'=>array(arrayName=>value))
9. $pullAll : 删除数组内的多个值 {$pull:{field:array_value}}
语法:db.collectionName.update({条件},{$pullAll :{field:[value1,value2.....]}})
php格式:array('$pullAll'=>array(arrayName=>array(value1,value2.....)))
10. $rename : 对字段进行重命名 {$rename:{old_field_name:new_field_name}}
语法:db.collectionName.update({条件},{$rename :{old_field_name:new_field_name}})
php格式:array('$rename'=>array(ld_field_name=>new_field_name))
接下来就说说upsert/multiple:(在php中格式:array('multiple'=>true,'upsert'=true))
1.upsert : 如果更新的数据不存在,是否插入新的文档,true为插入新的文档,false为不插入
语法:db.collectionName.update({条件},{更新内容},true(upsert ),false(multiple))
db.collectionName.update({条件},{内容},{upsert:true(false)})
2. multiple : 设置为false的时候,mongodb只会更新复合条件的第一条数据,设置为true时,则会更新所有符合条件的文档
语法:db.collectionName.update({条件},{内容},{multi:true(false)})
db.collectionName.update({条件},{内容},true(upsert ),true(multiple))