mongodb обновляет вложенный массив в документе с помощью PHP - PullRequest
1 голос
/ 30 декабря 2011

Пример структуры документа:

{
   "dob": "12-13-2001",
   "name": "Kam",

   "visits": {
     "0": {
       "service_date": "12-5-2011",
       "payment": "40",
       "chk_number": "1234455",  
    },
     "1": {
       "service_date": "12-15-2011",
       "payment": "45",
       "chk_number": "3461234",  
    },
     "2": {
       "service_date": "12-25-2011",
       "payment": "25",
       "chk_number": "9821234",  
    } 
  } 
}

Я пытаюсь обновить только "платеж" в посещении - 2 и номер chk_number в посещении - 1, используя следующее:


$query_criteria =  array("name" => "Kam", "dob" => "12-13-2001");

$updated_data = array();

$updated_data['visits'][1]['chk_number'] = 567;
$updated_data['visits'][2]['payment'] = 100;

$ret = $collection->update( $query_criteria, array('$set' => $updated_data), array("safe" => true) );

Но это обновление удаляет все посещения и перезаписывает их посетителями, содержащими только оплату и chk_number.

Я новичок в mongodb и PHP.Может кто-нибудь, пожалуйста, укажите мне, что я делаю неправильно и как решить эту проблему.

Заранее большое спасибо ........

1 Ответ

4 голосов
/ 30 декабря 2011

Вы должны использовать точечную запись.

db.collection.update(query_criteria, 
                     {$set: {'visit.2.payment': 100, 
                             'visit.1.chk_number': 567}});

То, что вы делаете, это:

db.collection.update(query_criteria, 
                     {'visit' : {'2' : {'payment': 100}}, 
                                {'1': {'chk_number': 567}}});

И это в основном означает "найти документ и перезаписать его с помощью этого новогоone ".

Код, который я написал, написан на Javascript (как они будут выглядеть в оболочке mongo).Я оставляю это на ваше усмотрение, чтобы перевести на правильный PHP (я не парень PHP).

...