当您在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}}
答案 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.ini
或mongo.ini
并添加/更改行mongo.native_long = 0