先說一個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))