我在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内部类型。接受的答案帮助我找到了答案。
答案 0 :(得分:5)
首先 - JavaScript(MongoDB shell)不区分double
和int
数字类型,因此您无法使用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)