使用PHP进行MongoDB升级和不一致的整数存储

时间:2013-01-24 16:31:02

标签: php mongodb pecl

由于升级到MongoDB 2.2和Mongo的1.3版PECL包(不确定哪个更改是相关的),我注意到通过PHP插入转换为int的字段现在作为NumberLong插入到我们的集合中({“userid “:NumberLong(792)})。以前,它们是作为整数插入的({“userid”:792})。而且,虽然新记录现在使用NumberLong,但我们的集合现在是混合的,类似的字段具有不同的类型。

这是否可能导致问题,尤其是索引和查找?是一种格式首选(我假设NumberLong是首选)?是否有一种直接的方式将我们的集合更新为新格式,假设这是一个好主意?

2 个答案:

答案 0 :(得分:1)

出于查询的目的,不应该对不同类型的数字字段有任何问题。整数,长数和双数都在进行比较之前进行转换。同样,如果您在某个数字字段x上有唯一索引,则会在尝试为1插入值为1.0x的两个文档时收到错误。这在Compare Order for BSON Types文档中提到。

答案 1 :(得分:-1)

我已经重写了这个答案,因为我昨晚很快就写了这个答案,并且从那时起就没有真正看过它。

这是因为native_long的ini设置已设置为

  

在这种情况下使用的MongoDB数据类型是BSON LONG,而不是在关闭此设置时使用的BSON INT。

http://php.net/manual/en/mongo.configuration.php#ini.mongo.native-long

这背后的基本原理是允许64位系统存储64位INT。

正如Doc页面所述:

  

此默认行为将在2.0.0中更改为TRUE,因此请确保将此变量设置为您想要的值(可能为TRUE),以便升级时驱动程序的行为不会突然改变。

因此,升级所有文档并确保它们与驱动程序的未来功能兼容可能是一个好主意。

所以回答:

  

是否有一种直接的方式将我们的集合更新为新格式,假设这是一个好主意?

不,没有。您需要浏览所有文档并使用正确的数据类型重新保存它们。

至于你的一些担忧:

  

这是否可能导致问题,尤其是索引和查找?是一种格式首选(我假设NumberLong是首选)?

这是一个不同的对象,所以它会导致查找这些数字的问题。

但是,如果您设置PHP应用程序来处理此位,驱动程序将自动将INT转换为它们在数据库中的相应表示形式。因此,一旦设置它就不会真正创建任何额外的工作,因为在PHP端你只能看到正常的int对象类型。

至于索引,它不应该影响那么多。只有值存储在索引中,并且这两个值之间的值相同。

如果您在使用此功能时遇到问题,可以随时通过注释掉实际启用此功能的行来从PHP.ini中将其关闭。