2011-01-09 4 views
18

я иметь этот документ в Монго:нажать новое значение для MongoDB внутреннего массива - MongoDB/PHP

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

и я хочу добавить еще одно значения поля «done_by», поэтому мой ожидаются документ будет ::

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

я попробовать это:

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

, но ничего не происходит, кто-нибудь знает, как это сделать?

ответ

37

Поскольку ни один из этих ответов на самом деле говорит вам, что здесь не так ...

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

Существует проблема с вашим $ push заявление, вы не нажимаете «done_by» со значением от "2" вы на самом деле отправки "done_by" и "2" ...

Вот вопрос ...

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

Это должно иметь => не в ,

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

Однако, обратите внимание, что каждый раз при запуске этого он будет вставить другой «2», если вы хотите MongoDB только врезке «2», если она уже не существует в «done_by», то вы шо пакетирования использовать $ addToSet ...

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

Это утверждение не добавит 2 каждый раз, только в первый раз.

+0

отлично, это то, что я ожидаю –

2

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

Так говорит manual: { $push : { field : value } }

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

и можно использовать, как это:

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

Когда вам нужно обновить использование $addToSet так избежать повторяющихся вставок, что приводит к нескольким записям.

Смежные вопросы