2011-01-09 10 views
18

mam ten dokument w Mongo:wcisnąć nową wartość do MongoDB wewnętrzną tablicę - MongoDB/php

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

i chcę, aby dodać kolejną wartość „done_by” pole, więc moja oczekuje dokument będzie ::

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

próbuję to:

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

ale nic się nie dzieje, ktoś wie jak to zrobić?

Odpowiedz

37

Ponieważ żadna z tych odpowiedzi jest faktycznie informacją, co się dzieje tutaj ...

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

Jest problem ze swoim $ push oświadczenie, nie naciskasz "done_by" o wartości "2" są faktycznie wysyłania "done_by" i "2" ...

Oto problem ...

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

ten powinien mieć => nie się ,

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

Należy jednak pamiętać, że za każdym razem uruchomić to będzie wstawić inny „2” jeśli chcesz MongoDB tylko wstawka „2” jeśli nie istnieją już w „done_by” wtedy sho uld używać $ addToSet ...

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

To stwierdzenie nie dodać 2 za każdym razem, tylko za pierwszym razem.

+0

świetnie, właśnie tego oczekuję –

2

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

Tak twierdzi manual: { $push : { field : value } }

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

u można użyć jako to:

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

Kiedy trzeba zaktualizować korzystanie $addToSet więc uniknąć duplikatów wkładki co prowadzi do wielu wpisów.

Powiązane problemy