MongoDB Integer

核心概念:存储层 (BSON) vs. 交互层 (Mongo Shell)

要理解这个问题,你必须区分两件事:

  1. MongoDB 的存储格式 (BSON): 这是数据实际在硬盘上存储的方式。在 BSON 规范中,整数类型被明确地分为两种:

    • Int32: 32位有符号整数。
    • Int64: 64位有符号整数。
  2. 你与 MongoDB 交互的方式 (Mongo Shell): 当你打开 mongosh 或旧的 mongo 命令行时,你进入的是一个 JavaScript 环境 。JavaScript 语言本身在设计上没有 独立的整数类型。它只有一种数字类型:Number,这是一个64位双精度浮点数(Double)。

这个区别就是所有困惑的根源。MongoDB 底层可以清晰地区分32位和64位整数,但你用来操作它的工具(Mongo Shell)默认情况下并不区分。


那么,到底能存多大的数据?

这取决于你希望数据以哪种 BSON 类型存储。

1. 32位整数 (Int32)
  • 存储范围: 从 -2,147,483,648 到 2,147,483,647 (大约正负21亿)。

  • 如何存入: 当你在 Mongo Shell 中输入一个在此范围内的整数时,MongoDB 会自动 选择 Int32 类型来存储它,因为这是最高效的方式。

    javascript 复制代码
    // 这个 age 会被存储为 BSON Int32 类型
    db.users.insertOne({ name: "张三", age: 30 })
2. 64位整数 (Int64)
  • 存储范围: 从 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 (一个非常巨大的数字)。

  • 如何存入 (重点!): 因为 Mongo Shell 默认使用浮点数,如果你直接输入一个超过32位范围的大整数,它默认会被存为 Double (浮点数)类型 ,而不是 Int64!

    javascript 复制代码
    // 警告:这个 large_number 默认会被存储为 Double 类型,而不是 Int64!
    db.stats.insertOne({ event_id: 3000000000 })
    ```这可能会导致精度问题或类型不匹配的查询问题。
    
    **正确的做法是,你必须显式地告诉 MongoDB 你想要存储一个64位整数。** 你需要使用 `NumberLong()` 这个辅助函数。
    
    ```javascript
    // 正确的方式:使用 NumberLong() 来指定存储为 BSON Int64 类型
    db.stats.insertOne({ event_id: NumberLong("3000000000") })
    
    // 或者对于较小的数字,也可以这样写
    db.inventory.insertOne({ quantity: NumberLong(500) })

解读 "根据你所采用的服务器"

这句话在现代MongoDB环境中已经不太准确了。现在可以理解为:

"MongoDB 支持 32位和64位两种整数类型,但你存入的数据具体 是哪种类型,取决于你插入的数值大小 以及你所使用的客户端/驱动程序(比如Mongo Shell)如何处理它。"

现代的MongoDB服务器(无论是32位还是64位操作系统上运行的)都完全支持 BSON 的 Int32 和 Int64。关键在于你作为开发者,如何清晰地表达你的意图。

总结与最佳实践

BSON 类型 范围 如何在 Mongo Shell 中插入 关键点
Int32 约 ±21 亿 直接输入整数 123 MongoDB 自动选择,是默认的小整数类型。
Double (浮点数) 直接输入小数 123.45 或超过 Int32 范围的整数 3000000000 注意! 大整数默认会变成浮点数。
Int64 约 ±9 x 10¹⁸ 必须使用 NumberLong("...") 存储大整数(如ID、计数器、时间戳)的标准方式。

一句话总结:

  • 如果你要存的整数在 正负21亿 以内,直接写数字就行。
  • 如果你要存的整数超过了这个范围 ,一定要用 NumberLong() 包裹起来,以确保它被正确地存储为64位整数,而不是浮点数。
相关推荐
数据库急诊室_阿哲1 小时前
一次加索引建议的复核记录:从报告到签字
数据库·ai数据库
青瓦梦滋2 小时前
Redis主从复制
服务器·数据库·redis·缓存·bootstrap
慧都小妮子3 小时前
Wyn商业智能国产数据库适配:数据接入、分析缓存与审计日志验证清单
数据库·数据分析·数据可视化·审计日志·商业智能
Joy T4 小时前
Redis Lua 原子限流:Lua 脚本、竞态条件与并发控制
数据库·redis·lua·限流·竞态条件·redis scripting
希和20274 小时前
51 单片机入门笔记:江科大课程代码逐行讲解(按键控制 LED 流水灯)
笔记·单片机·mongodb
杨凯凡4 小时前
MySQL 死锁怎么排查?InnoDB 锁等待与 Spring Boot 整事务重试实战
数据库·spring boot·mysql
Aloudata4 小时前
Claude 做数据分析的这两年:一份复盘与发展线索
大数据·数据库·人工智能·数据挖掘·数据分析·dataagent
Decay__4 小时前
01_SQLServer 体系架构全解 —— 实例进程、关系引擎、SQLOS 与事务日志深入
运维·数据库·sql·mysql·架构
希和20274 小时前
51 单片机 LED 流水灯:从直接法到循环法(江科大课程笔记)
笔记·单片机·mongodb
zhanghaha13144 小时前
C# 系列教程_12 字符串 string 保姆级系统教程(面向新手,大量示例 + 原理讲解)
开发语言·数据库·c#