1. ObjectId
- 存储大小:12字节。由4字节时间戳 + 3字节机器标识符 + 2字节进程ID + 3字节计数器组成。
- 查询效率:非常高,因为ObjectId的设计初衷就是作为唯一标识且在插入时天然有序(基于时间戳),适合作为主键查询。
- 实际场景:在大多数文档型数据库应用中,作为每个文档的默认主键。例如,一个博客系统中文章文档的
_id
字段就是ObjectId。
- 代码示例(Python - PyMongo):
from pymongo import MongoClient
client = MongoClient('mongodb://localhost:27017/')
db = client['blog_db']
articles = db['articles']
article = {
"title": "Sample Article",
"content": "This is a sample article content"
}
result = articles.insert_one(article)
print(result.inserted_id)
2. NumberLong
- 存储大小:8字节,用于存储64位有符号整数。
- 查询效率:在对大整数进行查询时,相比32位整数类型更高效。例如对一些系统中的订单编号、用户ID(如果预期会非常大)等。
- 实际场景:适合存储需要较大范围的整数数据,如统计系统中的页面浏览量累计数,电商系统中的订单流水号等。
- 代码示例(Java - MongoDB Java Driver):
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import org.bson.types.Decimal128;
import org.bson.types.ObjectId;
public class MongoDBExample {
public static void main(String[] args) {
MongoClient mongoClient = MongoClients.create("mongodb://localhost:27017");
MongoDatabase database = mongoClient.getDatabase("test_db");
MongoCollection<Document> collection = database.getCollection("numbers");
Document doc = new Document("number", new NumberLong(1234567890123456789L));
collection.insertOne(doc);
}
}
3. Decimal128
- 存储大小:16字节,用于精确存储十进制数。
- 查询效率:在对精确数值进行查询时效率较高,尤其适用于金融相关场景。但由于其存储结构相对复杂,相比简单整数类型可能稍慢一点,但在可接受范围内。
- 实际场景:用于金融领域,如银行存款金额、商品价格等对精度要求极高的数值。
- 代码示例(C# - MongoDB.Driver):
using MongoDB.Driver;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using System;
class Program
{
static void Main()
{
var client = new MongoClient("mongodb://localhost:27017");
var database = client.GetDatabase("finance_db");
var collection = database.GetCollection<FinancialRecord>("records");
var record = new FinancialRecord
{
Id = ObjectId.GenerateNewId(),
Amount = new Decimal128(1234.56m)
};
collection.InsertOne(record);
}
}
class FinancialRecord
{
[BsonId]
public ObjectId Id { get; set; }
public Decimal128 Amount { get; set; }
}
选择合适数据类型优化性能的策略
- 根据数据范围选择:如果数据范围较小,使用较小的整数类型(如Int32)可以节省存储空间;若预期数据范围大,选择NumberLong。
- 精度要求:对于需要精确计算的金融数据,使用Decimal128;而一般的整数计数可使用普通整数类型。
- 查询模式:如果经常根据某个字段作为唯一标识查询,使用ObjectId作为该字段类型;如果是范围查询数值,要考虑数值类型和索引的配合。