sql >> Database >  >> NoSQL >> MongoDB

MongoDB $set update record niet

Ik heb wat onderzoek gedaan naar waarom dit gebeurt. En ik denk niet dat ik een manier kan vinden om dit probleem "op te lossen".

JavaScript heeft een verschil tussen arrays en associatieve arrays/objecten. PHP heeft het verschil tussen arrays en objecten. Voor PHP is een associatieve array een array en voor JavaScript is het een object.

Wanneer het PHP-stuurprogramma een array naar een JSON-object moet converteren, probeert het te achterhalen of een array een van de volgende is:een normale array met opeenvolgend genummerde sleutels die beginnen met 0; of een associatieve array. De huidige implementatie betreft elke array met opeenvolgend genummerde sleutels, beginnend bij 0 een normale array. En een normale array bevat geen sleutels . En dit is het probleem. In de situatie dat de bestuurder een normale array ziet, is er geen veldnaaminformatie in de BSON die naar de server wordt verzonden, en daarom kan de server een veld niet bijwerken.

Ik kan geen manier bedenken om dit gedrag te veranderen zonder enige vorm van bestaande code te breken. Dus als u numerieke veldnamen wilt, moet u een stdClass-object gebruiken voor het "hoofddocument". Als alternatief kunt u die sleutels in een ingesloten document duwen en vervolgens bijwerken:

<?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);
?>


  1. MongoDB, Express, Node.Js en GridFS-stream gebruiken voor het opslaan van video- en afbeeldingsbestanden

  2. Regex om woorden in een zin te matchen met het voorvoegsel

  3. Omgaan met met mangoest gevulde velden in GraphQL

  4. $addToSet aan een array, maar het geeft me null