Это документ до редактирования.
{
"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, IdPedido = 3113. Состояние 30 - это то, что я хочу установить в EstadoPedido (которое в настоящее время составляет 20).
n: 0 означает «не соответствует». Кажется, вы сбиты с толку, потому что продолжаете использовать слово «набор», но это всего лишь условие «запроса». Вы просите «сопоставить где 20», а не «изменить с 20 на 30», что было бы чем-то совершенно отличным от того, что вы делаете. Вы по-прежнему "соответствуете где 20", просто вам нужно $set в том же поле до 30, и вы просто нигде этого не делаете.
@NeilLunn, что не имеет смысла, потому что, когда я установил его из состояния 10 в состояние 20, он работает нормально, и я не ищу состояние 20. Я просто устанавливаю этот IdPedido на состояние 20. Так что он должен работать. то же для состояния 30
Единственное, что здесь не имеет смысла, - это вопрос. Выбросьте здесь изображения и половину кода и покажите только два документа, используя представление JSON, а НЕ изображения. Покажите данные документа перед их обновлением, а затем покажите, как данные документа должны выглядеть «после» их обновления. Затем покажите утверждение об обновлении, которое, по вашему мнению, берет начало от A до B, и тогда мы сможем четко сказать вам, что вы делаете не так.
Вы вырезали «запрос» или часть $criteria из оператора update(). Мы постоянно говорим вам, что критерии должны искать "EstadoPedido" : 10, но вы, кажется, помещаете в эту часть 20 или 30. Покажите, какие значения, по вашему мнению, вы передаете, но для всех целей эти «критерии» выглядят как неправильные данные.
@NeilLunn спасибо за вашу помощь! Я уже обновил код. Надеюсь, что это было именно так.

Решено! Это была ошибка новичка! Все работало нормально, и запрос на обновление верен на 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;
}
Спасибо всем за вашу бесценную помощь! Надеюсь, это действительно может помочь кому-то другому.
Похоже, что не существует документа, соответствующего IdPedido 30.