12
votes

MongoDB $ Ensemble de mise à jour

J'essaie d'expérimenter MongoDB à l'aide de l'extension PHP Pecl, mais j'ai des difficultés à obtenir une certaine demande de mise à jour de travailler. J'ai parcouru des réponses avec peu de chance.

J'ai créé une collection de base: p> xxx pré>

Utilisation de FindOne code> et et var_dump code> L'enregistrement apparaît comme suit: p> xxx pré>

Le problème vient lorsque je veux mettre à jour à l'aide de $ définir code>. Je basse ma requête sur la cartographie montrée vers le bas de la SQL to Mongo Cheat dans le manuel PHP p>

Ici, je veux mettre à jour le champ 0 code> à la valeur 100 code> p> xxx pré >

Re-récupérer le dossier montre qu'il est reste inchangé fort>. P>

Je me suis demandé si je faisais quelque chose de mal avec le _id code>, quelle que soit la requête de mise à jour suivante fonctionne forte> remplaçant tout le dossier avec une nouvelle valeur, pas simplement mettre à jour le champ One. p>

array
  '_id' => 
    object(MongoId)[7]
      public '$id' => string '4f3bde65a1f7a0315b000000' (length=24)
  0 => int 100


2 commentaires

Est-ce que cela fonctionne: array ('$ SET' => tableau (1 => 100)) ?


@YI_H: que fait fonctionne. Champ 1 est mis à jour, pourquoi ne fonctionne-t-il pas pour le champ 0 ?


4 Réponses :


0
votes

Vous ne pouvez pas utiliser de numéro comme nom de champ valide dans MongoDB. Essayez de mettre votre champ "0" dans des citations, ce qui est de savoir comment il est mis en œuvre en réalité.


1 commentaires

Array ('$ Set' => Array ('0' => 100)) a le même résultat, champ 0 n'est pas mis à jour.



9
votes

Après avoir effectué divers tests, sur la base du commentaire de Yi_H fort> et de réponse de NNYTHM strong> J'ai trouvé ce qui suit.

Dans tous les cas, j'utilise ce code commun : p> xxx pré>

Les suivants ne fonctionnent pas du tout: p>

  • $ updateobj = tableau (0 => 100); CODE> LI>
  • $ updateobj = tableau ('0' => 100); code> li> ul>

    Ceux-ci fonctionnent: p>

    • $ updateobj = tableau (1 => 100); code> li>
    • $ updateobj = tableau ('1' => 100); code> li> ul>

      Après un peu de googling et de lire certains des documents de Mongo PHP, j'ai trouvé que je peux utiliser des objets au lieu de tableaux. J'ai donc essayé ceci: p> xxx pré>

      cela fonctionne! H1>

      mais je n'ai pas pu savoir pourquoi ... p>

      EDIT: strong> p>

      POKING via le code source de l'extension Mongo P>

      Mongocollection-> Mise à jour Code> Méthode effectue les éléments suivants, BUF est Déjà un pointeur et newObj est un zval (le deuxième paramètre de la requête). hash_p code> renvoie simplement la propriété appropriée de la Zval pour codage, selon qu'il s'agisse d'une matrice ou d'un objet. p> xxx pré>

      Le BSON_ENCODE La fonction code> effectue les éléments suivants, identiques en termes de fonctionnalité. Pointeur BUF et Zval Z. P>

      $updateObj = array(
          '0' => 100,
          '1' => 200
      );
      


3 commentaires

On dirait certainement un bug - si vous soumettez au pilote PHP ( Jira.mongodb.org/browse/php < / a>) Avec le genre de détail que vous avez ci-dessus, je suis sûr que Kristina & Co. va frapper une solution en un rien de temps :)


@Adamc: Argh, ils ont leur propre problème de suivi. J'ai déjà soumis un rapport pour le package pecl dans PHP Bugs , je déteste la duplication Ces choses mais leur propre système semble être beaucoup plus actif.


Oui - Tous les pilotes officiellement pris en charge ont leur propre tracker à Jira sur le site Mongodb.org. Si vous n'obtenez aucune traction sur le bogue de l'emballage, ouvrez-la et référendez le bug de package. Oh, et étant donné les détails ici, pas une mauvaise idée de lien vers cette question / réponse :)



11
votes

J'ai fait des enquêtes sur la raison pour laquelle cela se produit. Et je ne pense pas que je puisse trouver un moyen de "corriger" cette question.

JavaScript a une différence entre les tableaux et les tableaux / objets associatifs. PHP a la différence entre les tableaux et les objets. Pour PHP, une matrice associative est un tableau et pour JavaScript, c'est un objet.

Lorsque le pilote PHP doit convertir un tableau en un objet JSON, il essaie de déterminer si un tableau est soit: un tableau normal avec des touches numérotées séquentielles commençant par 0; ou un tableau associatif. La mise en œuvre actuelle concerne tout tableau avec des touches numérotées séquentiellement, à partir de 0 une matrice normale. Et un tableau normal ne contient pas clés . Et c'est le problème. Dans la situation, le pilote voit une matrice normale, il n'y a pas d'informations sur le nom de champ dans le BSON qui envoie au serveur, et donc le serveur ne peut donc pas mettre à jour un champ.

Je ne peux pas penser à un façon de changer ce comportement sans casser une sorte de code existant. Donc, si vous voulez des noms de terrain numériques, vous devrez utiliser un objet STDCLASS pour le «document principal». Sinon, vous pouvez appuyer sur ces touches dans un document intégré, puis mettre à jour: xxx


0 commentaires

-1
votes
we can update record in mongo db using php example below:-

$m = new MongoClient(<Put Replica set>); //PHP mongoclient function 
   echo "Connection to database successfully";
     $db = $m->dbname;  //put DB name
      $collection = $db->profile;

$document = array( 
                  "name" => $_REQUEST['name'], 
                  "email" => $_REQUEST['email'], 
                  "age" => $_REQUEST['age'],
                  "address" => $_REQUEST['address'],
                  "comment"=> $_REQUEST['comment']

               );

              // print_r($document); die;
             //echo $_REQUEST['pfid'];   
             $filter=array('_id'=>new MongoID( $_REQUEST['pfid'] ));
             $update=array('$set'=>$document);
    $collection->update( $filter, $update);

0 commentaires