Когда вы сделаете что-то подобное в 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
и поэтому нет смысла иметь числовой там.
Я использую php 5.5.10
с mongoDriver 1.5.1
Вот мое исследование об этом:
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 . И глядя на документацию в конфигурации монго :
Поведение по умолчанию для этого было изменено на TRUE в 1.5.0, поэтому обязательно установите эту переменную в нужное значение (возможно, ИСТИННО), чтобы при обновлении поведение драйвера не менялось внезапно.
Так что на самом деле это было изменено в 1.5.0
и для его возврата мне нужно только изменить его на FALSE
.
Для этого перейдите на ваш php.ini
или mongo.ini
и добавьте / измените строку mongo.native_long = 0