如何使用php在mongo 3.4中添加元素到嵌套数组

时间:2017-08-17 18:39:41

标签: php mongodb

我正在尝试将数组元素推入以下文档结构的内部数组

{
"_id" : ObjectId("599558a4a331801fe264bbb3"),
"zone" : "asia",
"country_list" : [
    {
        "country_name" : "india",
        "state_list" : [
            {
                "state_name" : "kerala"
            },
            {
                "state_name" : "tamilnadu"
            }
        ]
    },
    {
        "country_name" : "pak",
        "state_list" : [
            {
                "state_name" : "ins"
            }
        ]
    }
]
}

更新后的结构我想成为

{
"_id" : ObjectId("599558a4a331801fe264bbb3"),
"zone" : "asia",
"country_list" : [
    {
        "country_name" : "india",
        "state_list" : [
            {
                "state_name" : "kerala",
                "city_list" : [
                          {
                            "cityname" : "tvm"
                          },
                          {
                            "cityname" : "kchi"
                          },
                 ]
            },
            {
                "state_name" : "tamilnadu"
            }
        ]
    },
    {
        "country_name" : "pak",
        "state_list" : [
            {
                "state_name" : "ins"
            }
        ]
    }
]
}

但是,当我尝试以下代码时

$result     = $this->collection->findOneAndUpdate(array(
        "country_list.state_list.state_name"=>$this->getState()
    ), array(
        '$push'=>array("country_list.state_list.$.city_list"=>array("city_name"=>$this->getCity()))
    ));

我收到错误

未捕获的MongoDB \ Driver \ Exception \ RuntimeException:无法使用part_(country_list.state_list.0.city_list的country_list)遍历该元素({country_list:[{country_name:“india”,state_list:[{state_name:“ kerala“},{state_name:”tamilnadu“}]},{country_name:”pak“,state_list:[{state_name:”ins“}]}]})

我正在使用mongo 3.4和php 7

1 个答案:

答案 0 :(得分:0)

错误原因country_list是一个数组,因此您必须使用$ set或$ push语句的位置运算符。

解决方案:在MongoDB 3.4中,位置运算符($)只能使用一次,因此使用位置运算符无法实现所需。您需要在客户端代码(PHP)中循环,准备更新的文档,然后再进行集合更新。

仅供参考 - 在3.6中,位置运算符得到了改进,因此您可以在升级后使用它。 https://jira.mongodb.org/browse/SERVER-831