2011-01-09 14 views
18

tengo este documento en mongo:impulsar un nuevo valor a MongoDB gama interior - mongodb/php

{ 
    "_id": ObjectId("4d0b9c7a8b012fe287547157"), 
    "done_by": ["1"] 
} 

y quiero añadir otro valor a "done_by" sobre el terreno, por lo que mi documento esperado será ::

{ 
    "_id": ObjectId("4d0b9c7a8b012fe287547157"), 
    "done_by": ["1","2","3"] 
} 

de que este intento:

$conn = new Mongo(); 
$q = $conn->server->gameQueue; 
$id = new MongoId("4d0b9c7a8b012fe287547157"); 
$q->update(array("_id"=>$id),array('$push' => array("done_by","2"))); 

pero no pasa nada, alguien sabe cómo hacer esto?

Respuesta

37

Dado que ninguna de estas respuestas son en realidad que le dice lo que está mal aquí ...

$conn = new Mongo(); 
$q = $conn->server->gameQueue; 
$id = new MongoId("4d0b9c7a8b012fe287547157"); 
$q->update(array("_id"=>$id),array('$push' => array("done_by","2"))); 

Hay un problema con su declaración $ push, no está presionando "done_by" con un valor de "2" en realidad se está enviando "done_by" y "2" ...

Aquí es la cuestión ...

array('$push' => array("done_by","2")) 

Esto debería tener un => No un ,

array('$push' => array("done_by" => "2")) 

sin embargo, tenga en cuenta que cada vez que se ejecuta este se inserte otro "2" si quieres MongoDB con sólo el recuadro "2" si no existe ya en "done_by" entonces sho ULD utilizar $ addToSet ...

array('$addToSet' => array("done_by" => "2")) 

Esta declaración no añadirá 2 cada vez, sólo la primera vez.

+0

genial, esto es lo que espero –

2

$push => array('done_by' => '2')

Así dice el manual: { $push : { field : value } }

3
$filter = array('_id'=>$id)); 
$update = array('$push'=>array('done_by'=>'2')); 
$q->update($filter,$update); 
-1

u puede utilizar como esto:

$conn = new Mongo(); 
$q = $conn->server->gameQueue; 
$id = new MongoId("4d0b9c7a8b012fe287547157"); 
$q->update(array("_id"=>$id),array('$addToSet' => array("done_by","2"))); 
0
$filter = array('_id'=>$id)); 
$update = array('$addToSet'=>array('done_by'=>'2')); 
$q->update($filter,$update); 

Cuando tenga que actualizar el uso $addToSet para que evitar inserciones duplicadas que conduce a múltiples entradas.

Cuestiones relacionadas