MST

星途 面试题库

面试题:MongoDB基本数据类型与性能优化

MongoDB的基本数据类型在存储和查询性能上存在差异。请详细阐述不同基本数据类型(如ObjectId、NumberLong、Decimal128等)在存储大小、查询效率等方面的特点,并结合实际场景说明如何根据业务需求选择合适的数据类型以优化数据库性能,若涉及到代码,请给出示例。
21.6万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

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作为该字段类型;如果是范围查询数值,要考虑数值类型和索引的配合。