我们有一个应用程序在MongoDB中存储来自C / C ++的一些配置值,并且能够重新启动(即它运行一段时间,有人中断应用程序,更改配置,然后再次运行应用程序,以及它从它停止的地方回来)。这就像布尔值和字符串配置的魅力一样。
但是我们有一些整数(在我们当前的C / C ++实现中 - 32位值)。当我使用MongoDB控制台修改这些整数值时,Mongo总是将它们存储为Number(在C / C ++实现中是可靠的)。我们将更改应用程序以获取需要整数的双值,但我想知道是否有办法强制Mongo从其JavaScript控制台存储整数。
有什么建议吗?
答案 0 :(得分:9)
在C / C ++“单词的意义”中,整数not actually guaranteed为32位值。 int
必须至少为16位,但通常与平台架构匹配(例如32或64位)。
正如@Jasd所提到的,JavaScript只有一个数字类型,它是一个浮点(C中的double
)。
从MongoDB shell中,您应该能够使用函数NumberInt(..)
来获取BSON 32-bit integer value或NumberLong(..)
以获得BSON 64位整数。
答案 1 :(得分:8)
您可以使用以下内容修复控制台上某个字段的所有值的类型:
db.Statistic.find({kodoId: {$exists: true}}).forEach(function (x) {
x.kodoId = NumberInt(x.kodoId);
db.Statistic.save(x);
});
这只会加载具有kodoId
字段的文档,并将它们转换为int并重新保存。你可以这样做:
db.Statistic.find({kodoId: {$exists: true}}, {kodoId: 1}).forEach(function (x) {
db.Statistic.update({ _id: x._id },
{$set: {
kodoId: NumberInt(x.kodoId)
}});
});
使用第二个参数仅加载kodoId值(希望来自索引)。这应该快得多,因为它不需要加载和重新保存整个文档 - 只需要一个字段。
答案 2 :(得分:0)
MongoDB的shell由JavaScript引擎提供支持。 JavaScript没有integer
的类型。它只知道Number
,它是浮点数的类型
您可以尝试使用MongoDB类型NumberLong
,但当我遇到同样的问题时,它对我来说无效。