MongoDB обновляет странное поведение - PullRequest
0 голосов
/ 28 мая 2018

Это документ перед редактированием.

{
"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 () - это класс для сохранения объекта на SQL Server с помощью Propelframework.

$ M_Ped = new \ Oncargo \ MongoApi \ Pedido () - это объект класса Mongo для сохранения.

И этот $ 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;
}

EDIT 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 голосов
/ 28 мая 2018

Это решено!Это была ошибка новичка!Все работало нормально, и запрос на обновление на 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;
}

Спасибо всем за вашу драгоценную помощь!Надеюсь, что это действительно может помочь кому-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...