gpt4 book ai didi

数字的 MongoDB 内部数据类型

转载 作者:可可西里 更新时间:2023-11-01 09:57:23 29 4
gpt4 key购买 nike

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

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

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

然后我将该 JSON 导入本地 MongoDB 服务器进行调查,当我在 C# 驱动程序中获得该长度字段时,它的类型再次为 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内部类型是 double 和整数,只有在 MongoDB Shell 中它们看起来像 number

现在,主要问题是您是否见过类似的东西或知道哪里出了问题?

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

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

更新

问题出在完全不同的地方。我对从 JSON(通过 JavaScript)导入文档使所有数字成为 double MongoDB 内部类型这一事实感到困惑。接受的答案帮助我发现了这一点。

最佳答案

首先 - 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 } });

使用 GUI 客户端(如 robomongo 或 MongoVUE)可能更容易查看字段类型。

我知道您使用的是 C# 驱动程序,但这也许可以让您了解发生了什么; perl 驱动程序 documentation描述使用 32/64 位整数时与数字的区别:

  • Programmer 1 saves an int on a 32-bit platform.
  • Programmer 2 retrieves the document on a 64-bit platform and re-saves it, effectively converting it to a 64-bit int.
  • Programmer 1 retrieves the document on their 32-bit machine, which decodes the 64-bit int as a double.

编辑:

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

By default, the mongo shell treats all numbers as floating-point values. The mongo shell provides the NumberInt() constructor to explicitly specify 32-bit integers.

关于数字的 MongoDB 内部数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23359878/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com