Длина номера в Mongodb 2.6 при вставке через phpDriver
Когда вы сделаете что-то подобное в Mongo 2.6 db.test.insert({a : 1, b : [2, 3]})
, вы получите { "_id" : ObjectId("..."), "a" : 3, "b" : [2, 3]}
. Ничего неожиданного.
Когда я делал подобное через php в Mongo 2.4.10
с 1.4.5 driver
:
$test->insert([
'a' => 1,
'b' => [2 ,3]
])
Я все еще получал те же самые обычные цифры. Но когда я делаю что-то подобное в Mongo 2.6.0
, результат другой:
{
"_id" : ObjectId("534a...567"),
"a" : NumberLong(1),
"b" : [
NumberLong(2),
NumberLong(3)
]
}
Как вы видите, числа преобразуются в NumberLong
. Также это одно и то же целое число (только оно может быть намного больше), я не хочу такого поведения, потому что а) его дольше читать в оболочке, б) все мои номера ниже 100000
, и поэтому нет смысла иметь там NumberLong.
Я использую php 5.5.10
с mongoDriver 1.5.1
1 answers
Вот мое расследование по этому поводу:
Mongoshell по умолчанию использует 32-разрядные числа, и поэтому я вижу эти обычные числа в консоли. Ранее по умолчанию все значения, вставленные с помощью phpDriver, были 32-разрядными
Я предполагаю, что это было изменено в драйвере, и по умолчанию сейчас предполагается, что значения равны 64 битам. Можно вернуться к нормальному поведению, выполнив это вручную с помощью mongoint32()
$test->insert([
'a' => new MongoInt32(1),
'b' => [new MongoInt32(2), new MongoInt32(3)]
]);
Это сохранит все как исправьте короткие числа в оболочке. Все еще ищу лучшее решение.
На самом деле, более внимательно изучив мой phpinfo()
, я обнаружил, что он имеет следующую строку mongo.native_long
, а значение равно 1
. На самом деле это вынуждает драйвер сохранять все как mongoint64. И просматривая документацию в конфигурации mongo:
Поведение по умолчанию для этого было изменено на TRUE в версии 1.5.0, поэтому обязательно установите для этой переменной нужное значение (возможно ВЕРНО) чтобы поведение драйвера внезапно не изменилось при обновлении.
Так что на самом деле это было изменено в 1.5.0
, и чтобы вернуть его обратно, мне нужно только изменить его на FALSE
.
Для этого перейдите в свой php.ini
или mongo.ini
и добавьте/измените строку mongo.native_long = 0