MongoDB更新奇怪的行为

时间:2018-05-28 10:31:59

标签: mongodb

这是编辑前的文件。

{
"EstadoPedido" : 10,
"IdPedido" : 3113,
"Meta" : {
    "DataAlt" : "2018-05-25 15:33:21",
    "DataCri" : "2018-05-25 15:28:51",
    "IdUserAlt" : "83",
    "IdUserCri" : 83,
    "UserAlt" : "AAA",
    "UserCri" : "AAA",
    "sDataAlt" : ISODate("2018-05-25T15:33:21.000Z"),
    "sDataCri" : ISODate("2018-05-25T15:28:51.000Z")
},

}

编辑后,“EstadoPedido”字段应为20或30:

{
    "EstadoPedido" : 30,
    "IdPedido" : 3113,
    "Meta" : {
        "DataAlt" : "2018-05-25 15:33:21",
        "DataCri" : "2018-05-25 15:28:51",
        "IdUserAlt" : "83",
        "IdUserCri" : 83,
        "UserAlt" : "AAA",
        "UserCri" : "AAA",
        "sDataAlt" : ISODate("2018-05-25T15:33:21.000Z"),
        "sDataCri" : ISODate("2018-05-25T15:28:51.000Z")
    },
}

EDIT //

这就是我调用函数并传递参数的方法:

$onapp->put('/pedido/setAnulado/:idPedido', function($idpedido){
    $P = new Pedido();
    $R = $P->setAnulado($idpedido);

    $M_Ped = new \Oncargo\MongoApi\Pedido();
    $ret = $M_Ped->setEstado($idpedido, 30);

    echo json_encode($R);
});

$ P = new Pedido()是使用Propel框架将对象保存到SQL Server的类。

$ M_Ped = new \ Oncargo \ MongoApi \ Pedido()是要保存的Mongo Class对象。

并且$ M_Ped-> setEstado转到此处:

public function setEstado($idPedido, $estado) {
    $this->IdPedido = $idPedido;
    $this->Estado = $estado;
    $r = $this->_mudaEstado($idPedido, $estado);
    return $r;
}

然后返回更新,完整功能是:

private function _mudaEstado($idPedido, $estadoPedido) {
    $userNome = $this->userData['Nome'];
    $c = $this->db->selectCollection('pedidos');

    if (date('I')) { $_dst = 3600; } else { $_dst = 0; }

    $DataAlt = date('Y-m-d H:i:s');
    $sDataAlt = new \MongoDate(strtotime($DataAlt) + $_dst);
    $criteria = array('IdPedido' => $idPedido);
    $update = array(
        '$set' => array(
            'EstadoPedido'          => $estadoPedido,
            'Meta.IdUserAlt'        => $this->userData['IdUser'],
            'Meta.UserAlt'          => $userNome,
            'Meta.DataAlt'          => $DataAlt,
            'Meta.sDataAlt'         => $sDataAlt
        )
    );
    $r = $c->update($criteria, $update);
    return $r;
}

编辑2 //

我还为两个场景做了一个print_r($ update),20个(工作正常)和30个(不工作),数据相同:

工作位的输出:

Array
(
    [$set] => Array
        (
            [EstadoPedido] => 20
            [Meta.IdUserAlt] => 83
            [Meta.UserAlt] => AAA
            [Meta.DataAlt] => 2018-05-28 14:26:07
            [Meta.sDataAlt] => MongoDate Object
                (
                    [sec] => 1527517567
                    [usec] => 0
                )

        )

)

这是非工作更新变量的输出:

Array
(
    [$set] => Array
        (
            [EstadoPedido] => 30
            [Meta.IdUserAlt] => 83
            [Meta.UserAlt] => AAA
            [Meta.DataAlt] => 2018-05-28 14:28:21
            [Meta.sDataAlt] => MongoDate Object
                (
                    [sec] => 1527517701
                    [usec] => 0
                )

        )

)

正如您所看到的,两个查询都是相同的,一个是有效的,另一个不是。

1 个答案:

答案 0 :(得分:0)

它已经解决了!这是一个新手错误!一切都很好,更新查询是100%正确!我唯一缺少的是将$ idPedido强制转换为Integer,因为参数是作为String传递的。现在它正在按预期工作。

private function _mudaEstado($idPedido, $estadoPedido) {
    $userNome = $this->userData['Nome'];
    $c = $this->db->selectCollection('pedidos');

    if (date('I')) { $_dst = 3600; } else { $_dst = 0; }

    $DataAlt = date('Y-m-d H:i:s');
    $sDataAlt = new \MongoDate(strtotime($DataAlt) + $_dst);
    $criteria = array('IdPedido' => (int)$idPedido); // Was missing the cast to int
    $update = array(
        '$set' => array(
            'EstadoPedido'          => $estadoPedido,
            'Meta.IdUserAlt'        => $this->userData['IdUser'],
            'Meta.UserAlt'          => $userNome,
            'Meta.DataAlt'          => $DataAlt,
            'Meta.sDataAlt'         => $sDataAlt
        )
    );
    $r = $c->update($criteria, $update);
    return $r;
}

感谢大家的宝贵帮助!希望这实际上可以帮助别人。

相关问题