Skip to content

数据类型

BSON 类型概述

MongoDB 使用 BSON(Binary JSON)格式存储数据,支持丰富的数据类型。

类型列表

类型编号说明
Double1浮点数
String2字符串
Object3嵌套文档
Array4数组
Binary data5二进制数据
Undefined6已废弃
ObjectId7对象ID
Boolean8布尔值
Date9日期
Null10空值
Regular Expression11正则表达式
JavaScript13JavaScript代码
Symbol14符号
JavaScript (with scope)15带作用域的JS
32-bit integer1632位整数
Timestamp17时间戳
64-bit integer1864位整数
Decimal12819128位十进制
Min key-1最小键
Max key127最大键

数值类型

32位整数 (int)

javascript
db.numbers.insertOne({ int_val: NumberInt(42) });
db.numbers.insertOne({ int_val: NumberInt("-123") });

64位整数 (long)

javascript
db.numbers.insertOne({ long_val: NumberLong(1234567890123) });
db.numbers.insertOne({ long_val: NumberLong("9223372036854775807") });

浮点数 (double)

javascript
db.numbers.insertOne({ double_val: 3.14159 });
db.numbers.insertOne({ double_val: NumberDecimal("3.14159265358979") });

Decimal128 (高精度)

javascript
db.numbers.insertOne({ decimal_val: NumberDecimal("123.45678901234567890") });

数值类型比较

类型范围精度适用场景
int32-2^31 ~ 2^31-1整数小整数
int64-2^63 ~ 2^63-1整数大整数
double±1.7×10^30815-17位科学计算
Decimal128±9.99×10^614434位财务计算
javascript
db.products.insertOne({
  name: "商品A",
  price: NumberDecimal("99.99"),
  stock: NumberInt(100),
  sales: NumberLong(1234567890),
});

字符串类型

UTF-8 字符串

javascript
db.users.insertOne({
  name: "张三",
  email: "zhangsan@example.com",
  description: "这是一段描述文字",
});

字符串操作

javascript
db.users.find({ name: { $type: "string" } });
db.users.find({ name: { $type: 2 } });

日期类型

Date 对象

javascript
db.events.insertOne({
  name: "事件A",
  created_at: new Date(),
  updated_at: new Date("2024-01-01"),
});

ISODate

javascript
db.events.insertOne({
  date: ISODate("2024-01-15T10:30:00Z"),
});

时间戳 (Timestamp)

javascript
db.events.insertOne({
  ts: Timestamp(1705312200, 1),
});

Date vs Timestamp

特性DateTimestamp
精度毫秒秒 + 序号
用途业务日期内部操作
范围更大有限
javascript
db.logs.insertOne({
  message: "操作日志",
  log_time: new Date(),
  op_time: Timestamp(),
});

ObjectId

结构

ObjectId(5f8d8b7e9c9d6e1d9c8b7e6a)
         ││││││││││││
         │││││││││││└── 计数器 (3字节)
         ││││││││││└─── 计数器
         │││││││││└──── 计数器
         ││││││││└───── 机器ID (3字节)
         │││││││└────── 机器ID
         ││││││└─────── 机器ID
         │││││└──────── 进程ID (2字节)
         ││││└───────── 进程ID
         │││└────────── 时间戳 (4字节)
         ││└─────────── 时间戳
         │└──────────── 时间戳
         └───────────── 时间戳

创建 ObjectId

javascript
db.users.insertOne({ _id: ObjectId(), name: "张三" });
db.users.insertOne({ name: "李四" });

获取时间戳

javascript
let id = ObjectId("5f8d8b7e9c9d6e1d9c8b7e6a");
id.getTimestamp();

自定义 _id

javascript
db.users.insertOne({ _id: 1, name: "张三" });
db.users.insertOne({ _id: "user_001", name: "李四" });

布尔类型

javascript
db.users.insertOne({
  name: "张三",
  active: true,
  verified: false,
});

空值

javascript
db.users.insertOne({
  name: "张三",
  phone: null,
});

查询 null

javascript
db.users.find({ phone: null });
db.users.find({ phone: { $exists: false } });
db.users.find({ phone: { $type: 10 } });

数组类型

基本数组

javascript
db.users.insertOne({
  name: "张三",
  tags: ["tech", "life", "travel"],
  scores: [85, 90, 78],
});

嵌套数组

javascript
db.users.insertOne({
  name: "张三",
  addresses: [
    { city: "北京", type: "home" },
    { city: "上海", type: "work" },
  ],
});

数组操作

javascript
db.users.updateOne({ name: "张三" }, { $push: { tags: "music" } });

db.users.updateOne({ name: "张三" }, { $pull: { tags: "life" } });

db.users.updateOne({ name: "张三" }, { $addToSet: { tags: "tech" } });

嵌套文档

单层嵌套

javascript
db.users.insertOne({
  name: "张三",
  profile: {
    age: 25,
    city: "北京",
    email: "zhangsan@example.com",
  },
});

多层嵌套

javascript
db.users.insertOne({
  name: "张三",
  profile: {
    basic: {
      age: 25,
      gender: "male",
    },
    contact: {
      email: "zhangsan@example.com",
      phone: "13800138000",
    },
  },
});

查询嵌套字段

javascript
db.users.find({ "profile.age": 25 });
db.users.find({ "profile.basic.gender": "male" });

二进制类型

BinData

javascript
db.files.insertOne({
  name: "document.pdf",
  data: BinData(0, "base64encodedstring"),
});

子类型

子类型编号说明
Generic0通用二进制
Function1函数
Binary (Old)2旧二进制
UUID (Old)3旧UUID
UUID4UUID
MD55MD5哈希
Encrypted6加密数据

UUID

javascript
db.users.insertOne({
  uuid: UUID("3b241101-e2bb-4255-8caf-4136c566a962"),
});

正则表达式

javascript
db.users.insertOne({
  name: "张三",
  pattern: /^/,
});

db.users.find({ name: { $regex: /^/ } });
db.users.find({ name: { $regex: "张", $options: "i" } });

JavaScript 代码

Code

javascript
db.scripts.insertOne({
  name: "计算脚本",
  code: function (x) {
    return x * 2;
  },
});

Code with Scope

javascript
db.scripts.insertOne({
  name: "带作用域脚本",
  code: Code("return x + y", { x: 10, y: 20 }),
});

类型判断与转换

$type 操作符

javascript
db.users.find({ age: { $type: "number" } });
db.users.find({ age: { $type: ["number", "string"] } });
db.users.find({ name: { $type: 2 } });

类型转换 ($convert)

javascript
db.users.aggregate([
  {
    $project: {
      name: 1,
      age: { $convert: { input: "$age", to: "string" } },
    },
  },
]);

类型转换函数

函数说明
$toString转字符串
$toInt转整数
$toLong转长整数
$toDouble转浮点数
$toDecimal转Decimal128
$toBool转布尔值
$toDate转日期
$toObjectId转ObjectId
javascript
db.users.aggregate([
  {
    $project: {
      name: 1,
      age_str: { $toString: "$age" },
      price_decimal: { $toDecimal: "$price" },
    },
  },
]);

类型选择建议

数值类型

  • 主键: ObjectId 或自定义
  • 年龄: int32
  • 价格: Decimal128
  • 统计数据: int64 或 double

字符串类型

  • 用户名: String
  • 长文本: String
  • 固定格式: String + 验证

日期时间

  • 创建时间: Date
  • 更新时间: Date
  • 操作日志: Timestamp

复杂结构

  • 标签列表: Array
  • 用户资料: Embedded Document
  • 关联数据: ObjectId 引用

下一步学习