2011-01-09 7 views
18

j'ai ce document mongo:pousser nouvelle valeur à MongoDB tableau intérieur - MongoDB/php

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

et je veux ajouter une autre valeur au champ « done_by », donc mon document attendu sera ::

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

i essayer ceci:

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

, mais rien ne se passe, quelqu'un sait comment faire cela?

Répondre

37

Comme aucune de ces réponses vous disent en fait ce qui est mal ici ...

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

Il y a un problème avec votre $ push déclaration, vous ne poussez pas "done_by" avec une valeur "2" vous envoyez en réalité "done_by" et "2" ...

Voici la question ...

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

Cela devrait avoir un => pas ,

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

Cependant, notez que chaque fois que vous exécutez cela, il va insérer un autre « 2 » si vous voulez MongoDB pour insérer seulement « 2 » si elle n'existe pas déjà dans « done_by » vous sho ULD utiliser $ addToSet ...

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

Cette déclaration n'ajoutera 2 à chaque fois, que la première fois.

+0

super, c'est ce que j'attends –

2

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

Ainsi dit le manual: { $push : { field : value } }

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

u peut utiliser comme ceci:

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

Lorsque vous avez besoin de mettre à jour l'utilisation $addToSet pour vous éviter des inserts en double qui conduit à plusieurs entrées.

Questions connexes