更新文档无法正常工作


Update document doesnt work right

我正在使用下面的代码来更新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 修饰符。