MongoDB数字的内部数据类型

时间:2014-04-29 08:49:44

标签: mongodb mongodb-.net-driver bson

我在MongoDB中有相当复杂的数据结构。我的自定义数组由项目+长度字段表示(它是另一个故事,为什么JSON数组在我的特定情况下不起作用)。保存和更新长度字段的代码是通用的,始终提供整数,而不是浮点数或双精度数。长度字段的值始终为32位整数,直到昨天我未能将其中一个转换为int32,因为它实际上是double

所以我有一千个有问题的文件(所有相同的层次结构)。首先,我将其导出为JSON。有问题的字段的值是56,在JSON中它看起来像:

    ...
        "55": {
        ...
        },
        "Length": 56
    },
    ...

然后我将JSON导入到本地MongoDB服务器进行调查,当我在C#驱动程序中获取该Length字段时,它的类型为double。同一文档中的其他长度字段是整数。这让我怀疑是这个讨厌行为的C#驱动程序。要分离MongoDB服务器和C#驱动程序,我需要在MongoDB服务器中检查这个值类型,但我不知道如何。尝试

typeof db.collection.findOne({...}, {"path.to.value": 1}).path.to.value

为我的所有长度值打印number。但我不相信MongoDB,因为简单的测试:

db.test.save({fint: NumberInt(0)})
typeof db.test.findOne().fint

也打印number

根据MongoDB BSON Types内部类型是双精度和整数,它只在MongoDB Shell中看起来像number s。

现在,主要的问题是你有没有见过类似的东西或者有什么问题?

更具体的问题:如何检查确切的内部数据类型值?

MongoDB 2.4.6,C#驱动程序1.8.1,可在Windows和Linux上看到

更新

问题出在完全不同的地方。我很困惑,从JSON(通过JavaScript)导入文档使得所有数字都是double MongoDB内部类型。接受的答案帮助我找到了答案。

2 个答案:

答案 0 :(得分:5)

首先 - JavaScript(MongoDB shell)不区分doubleint数字类型,因此您无法使用MongoDB shell检查它:

typeof 1 === typeof 1.1 // true

您可以执行使用$type运算符的查询,按类型查询字段:

// 1 for double, 16 for int32, 18 for int64
db.myColl.find({ fint : { $type : 1 } }); 

使用像robomongo或MongoVUE这样的GUI客户端可能更容易看到字段的类型。

我知道你正在使用C#驱动程序,但这可能会让你知道发生了什么; perl driver documentation描述了使用32/64位整数时与数字的区别:

  
      
  • 程序员1在32位平台上保存int。
  •   
  • 程序员2在64位平台上检索文档并重新保存,有效地将其转换为64位int。
  •   
  • 程序员1在他们的32位机器上检索文档,该机器将64位int解码为double。
  •   

修改

我刚刚注意到您对使用MongoDB shell导入数据的评论。您可以查看有关MongoDB shell data types的MongoDB文档,以查看默认行为:

  

默认情况下,mongo shell将所有数字视为浮点数   值。 mongo shell提供了NumberInt()构造函数   明确指定32位整数。

答案 1 :(得分:2)

我没有遇到类似的事情。

关于你的第二个问题,我使用MongoVUE并且它有一个Type列:

enter image description here