我正在使用下面的代码来更新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 被遗忘并且没有更新?结构正确吗?
谢谢
为什么第二个 ean 被遗忘了 [...] ?
正如@gypsyCoder在评论中建议的那样,使用$push
将解决您的问题。
原因是$set
将创建或替换字段。但是,如果数组字段尚不存在,$push
创建一个数组字段,并将该项追加到该数组的末尾。
因此,给定您的示例,正确的代码应如下所示:
$new_data = array(
'$push' => array(
'inventar' => array(
'ean' => $ean,
'amount' => $amount
)
)
);
$collection->update(array("tablename"=>$tablename), $new_data);
请注意,默认情况下,$push
一次只会推送一个项目。因此,您不得包装要推送到数组中的项目。如果需要将多个项目作为同一 update 语句的一部分推送,则需要将所有元素包装在一个数组中,作为参数传递给 $each
修饰符。