NumberLong в 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 и поэтому нет смысла иметь числовой там.

Я использую 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