从控制台将MongoDB字段的类型更改为整数

时间:2012-07-01 11:02:16

标签: javascript c++ mongodb

我们有一个应用程序在MongoDB中存储来自C / C ++的一些配置值,并且能够重新启动(即它运行一段时间,有人中断应用程序,更改配置,然后再次运行应用程序,以及它从它停止的地方回来)。这就像布尔值和字符串配置的魅力一样。

但是我们有一些整数(在我们当前的C / C ++实现中 - 32位值)。当我使用MongoDB控制台修改这些整数值时,Mongo总是将它们存储为Number(在C / C ++实现中是可靠的)。我们将更改应用程序以获取需要整数的双值,但我想知道是否有办法强制Mongo从其JavaScript控制台存储整数。

有什么建议吗?

3 个答案:

答案 0 :(得分:9)

在C / C ++“单词的意义”中,整数not actually guaranteed为32位值。 int必须至少为16位,但通常与平台架构匹配(例如32或64位)。

正如@Jasd所提到的,JavaScript只有一个数字类型,它是一个浮点(C中的double)。

从MongoDB shell中,您应该能够使用函数NumberInt(..)来获取BSON 32-bit integer valueNumberLong(..)以获得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,但当我遇到同样的问题时,它对我来说无效。