вставить новое значение во внутренний массив mongodb - mongodb / php - PullRequest
19 голосов
/ 09 января 2011

У меня есть этот документ в монго:

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

, и я хочу добавить другое значение в поле done_by, поэтому мой ожидаемый документ будет ::

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

iпопробуйте это:

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

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

Ответы [ 5 ]

41 голосов
/ 10 января 2011

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

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

4 голосов
/ 10 января 2011
$filter = array('_id'=>$id));
$update = array('$push'=>array('done_by'=>'2'));
$q->update($filter,$update);
2 голосов
/ 10 января 2011

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

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

0 голосов
/ 05 февраля 2018
$filter = array('_id'=>$id));
$update = array('$addToSet'=>array('done_by'=>'2'));
$q->update($filter,$update);

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

0 голосов
/ 09 апреля 2014

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

$conn = new Mongo();
$q = $conn->server->gameQueue;
$id = new MongoId("4d0b9c7a8b012fe287547157");
$q->update(array("_id"=>$id),array('$addToSet' => array("done_by","2")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...