mongodb使用PHP更新文档中的嵌套数组

时间:2011-12-29 23:43:14

标签: php mongodb updating multidimensional-array

文档结构示例是:

{
   "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 -


$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的vists覆盖它们。

我是mongodb和PHP的新手。任何人都可以指出我做错了什么以及如何解决这个问题。

非常感谢提前........

1 个答案:

答案 0 :(得分:4)

您应该使用点符号。

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

它基本上意味着“找到一个文件并用这个新文件覆盖它”。

我写的代码是用Javascript编写的(因为它们会出现在mongo shell中)。我把它留给你翻译成适当的PHP(我不是一个PHP人)。