5

我们有一个应用程序,它在 MongoDB 中存储来自 C/C++ 的一些配置值,并具有重新启动的能力(即它运行一段时间,有人中断应用程序,更改配置,然后再次运行应用程序,它会在哪里找到它停止了)。这就像布尔和字符串配置的魅力。

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

有什么建议么?

4

3 回答 3

9

在 C/C++ 的“词义”中,int实际上并不能保证是 32 位值。Anint必须至少为 16 位,但通常与平台架构相匹配(例如 32 或 64 位)。

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

在 MongoDB shell 中,您应该能够使用这些函数NumberInt(..)来获取BSON 32 位整数值NumberLong(..)获取 BSON 64 位整数。

于 2012-07-01T21:27:15.100 回答
9

您可以通过以下方式修复控制台上某个字段的所有值的类型:

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 值(希望来自索引)。这应该快得多,因为它不需要加载和重新保存整个文档 - 只是一个字段。

于 2014-02-25T14:00:54.460 回答
0

MongoDB 的外壳由 JavaScript 引擎提供支持。并且 JavaScript 没有integer. 它只知道Number,这是浮点数的一种类型。
您可以尝试使用 MongoDB 类型NumberLong,但是当我遇到同样的问题时,它并没有解决。

于 2012-07-01T11:29:07.453 回答