2012-07-26 64 views
1

好吧,這個問題推動了我,我認爲_id是爲了在第一次插入它時使用ObjectID,當我嘗試使用_id進行更新時,它不正確。mongoDB不會允許我更新

這裏是我的代碼

//Save Data 
    function savedata($data){ 
     $collection = $this->db->retail_logs; 
     $this->data = $data; 

     if($this->data['_id'] == NULL || $this->data['_id'] == "") 
     { 
      $this->data['_id'] = new MongoId(); 
     } 
     else 
     { 
     $this->data['_id'] = ObjectID($this->data['_id']); 
     } 
     try { 
     $collection->update(
      array("_id"=>$this->data['_id']), 
      $this->data, // new lead document to insert 
      array("upsert" => true, "safe" => true) 
      ); 

      print $this->data['_id']; 
     } catch (Exception $e) { 
      print "we are not able to update"; 
     } 
    } 

我試圖做followinf

if($this->data['_id'] == NULL || $this->data['_id'] == "") 
      { 
       $this->data['_id'] = new MongoId(); 
      } 
      else 
      { 
      $this->data['_id'] = ObjectID($this->data['_id']); 
      } 

,但似乎沒有幫助。

正在發生的事情是正確地插在第一時間與對象ID(IDNumber中) 然後它更新時,刪除對象ID(),並插入用相同的IDNumber一個新的鉛作爲

所以看起來前像「的ID號」

+0

什麼是'的print_r($ E)'輸出? – 2012-07-26 03:16:10

+0

它更新,​​但它插入一個新的蒙戈行 – RussellHarrower 2012-07-26 03:23:42

回答

2

你原來的代碼是接近的,但如果你想使一個字符串_id正確的對象ID類型,用途:

$this->data['_id'] = new MongoId($this->data['_id']); 
0

檢查已更新請求

非UPSERT更新可以或可以不修改現有對象的結果。一個upsert會修改一個現有的對象或插入一個新的對象。客戶端可以通過隨後發出getlasterror命令(db.runCommand(「getlasterror」))來確定其連接上的最新消息是否更新了現有對象。如果getlasterror命令的結果包含updatedExisting字段,則連接上的最後一條消息是更新請求。如果updatedExisting字段的值爲true,則該更新請求會導致更新現有對象;如果updatedExisting爲false,則不更新現有對象。一個「upserted」字段將包含新的_id值,如果執行插入(如新的1.5.4)

可以運行命令由蒙戈文檔的建議,讓我們知道該命令的結果

參考:Mongo Updating