Длина номера в 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

Author: Salvador Dali, 2014-04-13

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

 8
Author: Salvador Dali, 2014-04-13 09:36:10