2012-07-26 5 views
1

이 문제는 나를 괴롭 히고 있습니다. _id를 사용하여 업데이트하려고하면 _id가 처음으로 삽입 될 때 _id가 ObjectID가 될 것이라고 생각했습니다.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']); 
      } 

을하려고 노력했지만 그 도움이되지 보인다.

는 OBJECTID (idnumber) 다음 ObjectId가을 (제거 될 때 업데이트 진행) 제대로 처음 삽입 등

이 보이는 전에 같은 idnumber으로 새로운 리드를 삽입 무슨 일이 일어나고있다 업데이트 요청

비 upsert 업데이트하거나 기존 객체를 수정하지 않을 수의 결과를 확인 "IDNUMBER"

+0

'인 print_r ($ 전자)'의 출력은 무엇입니까? –

+0

업데이트되지만 새로운 mongo 행이 삽입됩니다. – RussellHarrower

답변

2

원래 코드가 가깝습니다,하지만 당신은 문자열 _id을하려면 올바른 OBJECTID 유형, 사용 :

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

있다. upsert는 기존 개체를 수정하거나 새 개체를 삽입합니다. 클라이언트는 연결에서 가장 최근의 메시지가 getlasterror 명령 (db.runCommand ("getlasterror"))을 연속적으로 발행하여 기존 객체를 업데이트했는지 여부를 판단 할 수 있습니다. getlasterror 명령의 결과에 updatedExisting 필드가 들어 있으면 연결의 마지막 메시지가 업데이트 요청이었습니다. updatedExisting 필드의 값이 true이면 해당 업데이트 요청으로 인해 기존 개체가 업데이트됩니다. updatedExisting이 false 인 경우 기존 객체가 업데이트되지 않았습니다. 에 "upserted"필드 몽고 문서에 의해 제안 삽입이

당신은 명령을 실행할 수 (1.5.4 기준으로 신규) 수행되는 경우 새로운 _id 값을 포함하고 우리가 명령의 결과를 알려드립니다

참조 : Mongo Updating