Appearance
数据类型
BSON 类型概述
MongoDB 使用 BSON(Binary JSON)格式存储数据,支持丰富的数据类型。
类型列表
| 类型 | 编号 | 说明 |
|---|---|---|
| Double | 1 | 浮点数 |
| String | 2 | 字符串 |
| Object | 3 | 嵌套文档 |
| Array | 4 | 数组 |
| Binary data | 5 | 二进制数据 |
| Undefined | 6 | 已废弃 |
| ObjectId | 7 | 对象ID |
| Boolean | 8 | 布尔值 |
| Date | 9 | 日期 |
| Null | 10 | 空值 |
| Regular Expression | 11 | 正则表达式 |
| JavaScript | 13 | JavaScript代码 |
| Symbol | 14 | 符号 |
| JavaScript (with scope) | 15 | 带作用域的JS |
| 32-bit integer | 16 | 32位整数 |
| Timestamp | 17 | 时间戳 |
| 64-bit integer | 18 | 64位整数 |
| Decimal128 | 19 | 128位十进制 |
| Min key | -1 | 最小键 |
| Max key | 127 | 最大键 |
数值类型
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^308 | 15-17位 | 科学计算 |
| Decimal128 | ±9.99×10^6144 | 34位 | 财务计算 |
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
| 特性 | Date | Timestamp |
|---|---|---|
| 精度 | 毫秒 | 秒 + 序号 |
| 用途 | 业务日期 | 内部操作 |
| 范围 | 更大 | 有限 |
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"),
});子类型
| 子类型 | 编号 | 说明 |
|---|---|---|
| Generic | 0 | 通用二进制 |
| Function | 1 | 函数 |
| Binary (Old) | 2 | 旧二进制 |
| UUID (Old) | 3 | 旧UUID |
| UUID | 4 | UUID |
| MD5 | 5 | MD5哈希 |
| Encrypted | 6 | 加密数据 |
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 引用