После выполнения различных тестов на основе комментария от yi_H и ответа от nnythm я обнаружил следующее.
Во всех случаях я использую этот общий код:
$collection->update(
array('_id' => $obj['_id']),
array('$set' => $updateObj)
);
Следующие не работают вообще:
$updateObj = array(0 => 100);
$updateObj = array('0' => 100);
Это работает:
$updateObj = array(1 => 100);
$updateObj = array('1' => 100);
Немного погуглив и прочитав некоторые документы по Mongo PHP, я обнаружил, что могу использовать объекты вместо массивов. Итак, я попробовал это:
$updateObj = new stdClass;
$updateObj->{0} = 100;
ЭТО РАБОТАЕТ!
Но я так и не смог выяснить, почему ...
Edit:
Просмотр исходного кода расширения Монго
Метод MongoCollection->update
выполняет следующее: buf уже является указателем, а newobj является zval (второй параметр запроса). HASH_P
просто возвращает правильное свойство zval для кодирования, в зависимости от того, массив это или объект.
zval_to_bson(buf, HASH_P(newobj), NO_PREP TSRMLS_CC)
Функция bson_encode
выполняет следующее, идентичное с точки зрения функциональности. указатель буф и zval z.
zval_to_bson(&buf, HASH_P(z), 0 TSRMLS_CC);
Итак, я выполнил следующий тест.
$updateObj = new stdClass;
$updateObj->{0} = 100;
$one = bson_encode($updateObj);
$updateObj = array(0 => 100);
$two = bson_encode($updateObj);
var_dump($one === $two);
Выход true
Все еще в недоумении, почему 0
не работает для имени поля в массиве.
Редактировать 2:
Дальнейший эксперимент показывает, что когда в обновление включено поле с именем 0
(только для массива, объект в порядке) обновления не выполняются ни для каких полей
Пример:
$updateObj = array(
'1' => 200
);
Работает, поле 1
обновлено.
$updateObj = array(
'0' => 100,
'1' => 200
);
Не работает , не , ни поле 0
, ни 1
не обновляются.
Я думаю, что собираюсь отправить сообщение об ошибке.