更新文档无法正常工作

时间:2015-06-14 16:35:38

标签: php arrays mongodb

我使用以下代码更新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被遗忘而没有更新? 结构是否正确?

谢谢

1 个答案:

答案 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修饰符。