【问题标题】:How to add element to nested array in mongo 3.4 using php如何使用php将元素添加到mongo 3.4中的嵌套数组
【发布时间】:2018-04-06 03:07:52
【问题描述】:

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

{
"_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: 无法使用部分 (country_list of country_list.state_list.0.city_list) 遍历元素 ({country_list: [ { country_name: "india", state_list: [ { state_name: "喀拉拉邦“}, { state_name: "tamilnadu" } ] }, { country_name: "pak", state_list: [ { state_name: "ins" } ] } ]})

我正在使用 mongo 3.4 和 php 7

【问题讨论】:

标签: php mongodb


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-07-21
    • 2015-04-02
    • 2017-01-07
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 2023-01-22
    • 1970-01-01
    • 2016-06-21
    相关资源
    最近更新 更多