我使用以下代码更新MongoDB文档:
foreach($jArray as $value){
$tablename = $value['tablename'];
$ean = $value["ean"];
$amount= $value["amount"];
$new_data = array(
'$set' => array(
'inventar' => array(
array (
'ean' => $ean,
'amount' => $amount
)
)
)
);
$collection->update(array("tablename"=>$tablename), $new_data);
$response["update"] = 1;
echo json_encode($response);
}
数据库看起来像执行这样的代码:
{
"_id": {
"$id": "557daa73d8291bc6268b4578"
},
"inventar": [
{
"ean": "802.6180.222",
"amount": "0"
}
],
"out_date": "15.05.2015",
"out_email": "email@email.com",
"out_user": "pb",
"tablename": "DD_AA"
}
但是发明部分应该包含更多的值。
我发送的json是:[{"amount":"0","ean":"802.0079.127","tablename":"DD_AA"},{"amount":"40","ean":"802.6180.222","tablename":"DD_AA"}]
为什么第二个ean被遗忘而没有更新? 结构是否正确?
谢谢
答案 0 :(得分:2)
为什么第二个ean被遗忘[...]?
正如@gypsyCoder在评论中所建议的,使用$push
将解决您的问题。
原因是$set
将创建或替换字段。但是,$push
创建一个数组字段(如果它尚不存在),并将该项附加到该数组的末尾。
所以,举个例子,正确的代码应如下所示:
$new_data = array(
'$push' => array(
'inventar' => array(
'ean' => $ean,
'amount' => $amount
)
)
);
$collection->update(array("tablename"=>$tablename), $new_data);
请注意,默认情况下$push
一次只会推送一个项目。因此,您不能将项目包装为推入数组。如果需要将多个项目作为同一更新语句的一部分进行推送,则需要将所有元素包装在一个数组中,作为参数传递给$each
修饰符。