2012-07-26 3 views
1

Ok ce problème me rend fou, je pensais que _id devait être ObjectID alors que la première fois qu'il l'insère correctement quand j'essaye de le mettre à jour en utilisant le _id cela ne fonctionne pas.mongoDB ne me permet pas de mettre à jour

ici est mon code

//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"; 
     } 
    } 

i ont essayé de faire le followinf

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

mais qui ne semble pas aider.

Ce qui se passe est-il insère la première fois correctement ObjectID (idnumber) puis quand il va mettre à jour est retire ObjectId() et insère une nouvelle piste avec le même idnumber comme avant

il semble comme « IDnumber »

+0

Quelle est la sortie de 'print_r ($ e)'? –

+0

il met à jour mais il insère une nouvelle ligne de mongo – RussellHarrower

Répondre

2

Votre code d'origine est proche, mais si vous voulez faire une chaîne _id type ObjectID correct, utilisez:

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

Vérification du résultat d'une demande de mise à jour

une mise à jour non-upsert peut ou ne peut pas modifier un objet existant. Un upsert modifiera un objet existant ou insérera un nouvel objet. Le client peut déterminer si son message le plus récent sur une connexion a mis à jour un objet existant en émettant par la suite une commande getlasterror (db.runCommand ("getlasterror")). Si le résultat de la commande getlasterror contient un champ updatedExisting, le dernier message de la connexion était une demande de mise à jour. Si la valeur du champ updatedExisting est true, cette demande de mise à jour a provoqué la mise à jour d'un objet existant; Si updatedExisting est false, aucun objet existant n'a été mis à jour. Un « upserted » champ contiendra la nouvelle valeur _id si un insert est réalisé (nouvelle au 1.5.4)

Pouvez-vous exécuter la commande comme suggéré par Mongo Docs et laissez-nous savoir le résultat de la commande

Référence: Mongo Updating

Questions connexes