0

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

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

4

2 回答 2

1

出于查询的目的,您应该对不同类型的数字字段没有任何问题。整数、长整数和双精度数在比较之前都会进行转换。同样,如果您在某个数字字段上有一个唯一索引x,您会在尝试插入两个具有值11.0for 的文档时收到错误消息xBSON 类型的比较顺序文档中提到了这一点。

于 2013-01-29T19:01:42.837 回答
-1

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

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

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

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

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

根据文档页面的建议:

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

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

所以回答:

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

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

至于你的一些担忧:

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

它是一个不同的对象,因此会导致通过这些数字进行查找时出现问题。

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

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

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

于 2013-01-24T16:35:38.273 回答