2013-12-08 57 views
0

我試圖更新文檔(1字段完全),但我得到意外的錯誤(shell更新工作正常)。沒有字段被更新。MongoDB php更新返回現有文檔的錯誤

操作:

$_POST['title_en'] = 'skyfall'; 
$editMovie = array('$set'=>array('title_en'=>$_POST['title_en'])); 
//JSON: {"$set":{"title_en":"Skyfall"}} 
$update = $collection->update(array('_id'=>$_POST['_id']), $editMovie); 

返回值:

array(5) { ["updatedExisting"]=> bool(false) ["n"]=> int(0) ["connectionId"]=> int(9) ["err"]=> NULL ["ok"]=> float(1) } 

shell命令就像一個魅力:

db.movies.update({"title_en":"skyfall"}, {$set:{"title_en":"Skyfall"}}) 
+0

但shell命令與PHP不同。您在PHP中使用'_id',但在shell中使用'title_en'。另外,你確定'$ _POST ['_ id']'被設置爲一個實際的ID嗎? –

+0

我處理find()以返回_id's,title_en和其他字段。然後我使用隱藏的表單域來保存這個_id。我用var_dump檢查過所有的值,看起來沒問題。 – jakubplus

+0

你有沒有試過'$ update = $ collection-> update(array('title_en'=> $ _ POST ['title_en']),$ editMovie);'? –

回答

0

當你與_id工作在MongoDB中使用PHP,請確保您用MongoId()對象封裝表單響應,將字符串轉換回MongoID:

$update = $collection->update(array('_id' => new MongoId($_POST['_id'])), $editMovie); 

換句話說,當你從一個形式響應得到ID,你基本上已經「投」的MongoID回一個字符串,所以你需要「uncast」它放回MongoID一次。

在你基於現有標題進行更新的例子中,你對字符串類型進行匹配,因此不需要強制轉換。