Странное поведение обновления 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")
    },
}

РЕДАКТИРОВАТЬ//

Вот как я вызываю функцию и передаю параметры:

$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 с использованием инфраструктуры Propel.

$ 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;
}

РЕДАКТИРОВАТЬ 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
                )

        )

)

Как видите, оба запроса одинаковы, и один работает, а другой - нет.

Похоже, что не существует документа, соответствующего IdPedido 30.

Catalin MUNTEANU 28.05.2018 12:34

Но в этом случае IdPedido не 30, IdPedido = 3113. Состояние 30 - это то, что я хочу установить в EstadoPedido (которое в настоящее время составляет 20).

António Pedro 28.05.2018 12:36
n: 0 означает «не соответствует». Кажется, вы сбиты с толку, потому что продолжаете использовать слово «набор», но это всего лишь условие «запроса». Вы просите «сопоставить где 20», а не «изменить с 20 на 30», что было бы чем-то совершенно отличным от того, что вы делаете. Вы по-прежнему "соответствуете где 20", просто вам нужно $set в том же поле до 30, и вы просто нигде этого не делаете.
Neil Lunn 28.05.2018 12:37

@NeilLunn, что не имеет смысла, потому что, когда я установил его из состояния 10 в состояние 20, он работает нормально, и я не ищу состояние 20. Я просто устанавливаю этот IdPedido на состояние 20. Так что он должен работать. то же для состояния 30

António Pedro 28.05.2018 12:39

Единственное, что здесь не имеет смысла, - это вопрос. Выбросьте здесь изображения и половину кода и покажите только два документа, используя представление JSON, а НЕ изображения. Покажите данные документа перед их обновлением, а затем покажите, как данные документа должны выглядеть «после» их обновления. Затем покажите утверждение об обновлении, которое, по вашему мнению, берет начало от A до B, и тогда мы сможем четко сказать вам, что вы делаете не так.

Neil Lunn 28.05.2018 12:45

Вы вырезали «запрос» или часть $criteria из оператора update(). Мы постоянно говорим вам, что критерии должны искать "EstadoPedido" : 10, но вы, кажется, помещаете в эту часть 20 или 30. Покажите, какие значения, по вашему мнению, вы передаете, но для всех целей эти «критерии» выглядят как неправильные данные.

Neil Lunn 28.05.2018 13:12

@NeilLunn спасибо за вашу помощь! Я уже обновил код. Надеюсь, что это было именно так.

António Pedro 28.05.2018 15:13
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
7
37
1

Ответы 1

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

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

Другие вопросы по теме