我已经重写了这个答案,因为我昨晚写得很快,从那以后就没有真正看过它。
这是因为 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 中将其关闭。