MongoDB数字的内部数据类型

And*_*hko 2 mongodb bson mongodb-.net-driver

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

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

    ...
        "55": {
        ...
        },
        "Length": 56
    },
    ...
Run Code Online (Sandbox Code Playgroud)

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

typeof db.collection.findOne({...}, {"path.to.value": 1}).path.to.value
Run Code Online (Sandbox Code Playgroud)

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

db.test.save({fint: NumberInt(0)})
typeof db.test.findOne().fint
Run Code Online (Sandbox Code Playgroud)

打印number也是.

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

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

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

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

UPDATE

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

Chr*_*n P 6

首先, -的JavaScript(MongoDB的外壳)不区分doubleint数字类型,所以你不能确认使用MongoDB的外壳:

typeof 1 === typeof 1.1 // true
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

编辑:

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

默认情况下,mongo shell将所有数字视为浮点值.mongo shell提供NumberInt()构造函数来显式指定32位整数.