Подтвердить что ты не робот

Нажмите новое значение для внутреннего массива 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")));

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

4b9b3361

Ответ 1

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

$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 каждый раз, только в первый раз.

Ответ 2

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

Ответ 3

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

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

Ответ 4

u может использовать как это:

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