我正在尝试将数组元素推入以下文档结构的内部数组
{
"_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
答案 0 :(得分:0)
错误原因:country_list
是一个数组,因此您必须使用$ set或$ push语句的位置运算符。
解决方案:在MongoDB 3.4中,位置运算符($)只能使用一次,因此使用位置运算符无法实现所需。您需要在客户端代码(PHP)中循环,准备更新的文档,然后再进行集合更新。
仅供参考 - 在3.6中,位置运算符得到了改进,因此您可以在升级后使用它。 https://jira.mongodb.org/browse/SERVER-831