通过phpDriver插入Mongodb 2.6中的NumberLong

时间:2014-04-13 09:13:42

标签: php mongodb

当您在Mongo 2.6 db.test.insert({a : 1, b : [2, 3]})中执行此类操作时,您将获得{ "_id" : ObjectId("..."), "a" : 3, "b" : [2, 3]}。没什么意外的。

当我在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。同样的整数(只有它可以更大),我不希望这种行为,因为a)在shell中读取的时间更长,b)我的所有数字都低于php 5.5.10并且因此没有必要在那里有数字。

我将mongoDriver 1.5.1与{{1}}

一起使用

1 个答案:

答案 0 :(得分:8)

以下是我对它的调查:

MongoShell默认使用32位数字,因此我在控制台中看到这些正常数字。以前默认情况下,使用phpDriver插入的所有值都是32位

我认为这在驱动程序中已更改,默认情况下,它现在假定值为64位。通过MongoInt32()

手动执行此操作可以恢复正常行为
$test->insert([
    'a' => new MongoInt32(1),
    'b' => [new MongoInt32(2), new MongoInt32(3)]
]);

这会将所有内容保存为shell中的正确短号。仍在寻找更好的解决方案。

实际上仔细查看我的phpinfo()我发现它有以下行mongo.native_long,值为1。实际上这是强制驱动程序将所有内容保存为MongoInt64。并查看mongo configuration中的文档:

  

此默认行为已在1.5.0中更改为TRUE,因此   确保将此变量设置为您想要的值(可能为TRUE)   这样当你的驾驶员的行为不会突然改变   升级。

所以实际上这在1.5.0中已更改并将其设置回来我只需要将其更改为FALSE

要执行此操作,请转到php.inimongo.ini并添加/更改行mongo.native_long = 0