MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB $set ne met pas à jour l'enregistrement

J'ai fait des recherches pour savoir pourquoi cela se produit. Et je ne pense pas pouvoir trouver un moyen de "résoudre" ce problème.

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

Lorsque le pilote PHP doit convertir un tableau en objet JSON, il essaie de déterminer si un tableau est soit :un tableau normal avec des clés numérotées séquentiellement commençant par 0; ou un tableau associatif. L'implémentation actuelle considère tout tableau avec des clés numérotées séquentiellement, à partir de 0 comme un tableau normal. Et un tableau normal ne contient pas de clés . Et c'est le problème. Dans la situation où le pilote voit un tableau normal, il n'y a pas d'informations de nom de champ dans le BSON qui est envoyé au serveur, et par conséquent le serveur ne peut pas mettre à jour un champ.

Je ne peux pas penser à un moyen de changer ce comportement sans casser toute sorte de code existant. Donc, si vous voulez des noms de champs numériques, vous devrez utiliser un objet stdClass pour le "document principal". Vous pouvez également insérer ces clés dans un document intégré, puis mettre à jour :

<?php
$m = new Mongo;
$collection = $m->demo->testcollection;

$collection->insert(array(
    "_id" => 'bug341',
    'data' => array( 0, 1, 1, 2, 3, 5 )
));

$obj = $collection->findOne();

$update = array('data.0' => 'zero int');

$collection->update(
    array( '_id' => 'bug341' ),
    array( '$set' => $update )
);


$obj = $collection->findOne();
var_dump($obj);
?>