Close Menu
Código Simples .NETCódigo Simples .NET
    Facebook X (Twitter) Instagram
    Trending
    • Processamento Assíncrono: Os Desafios da Escalabilidade
    • NewSQL em 2025: O Estado Atual, Tendências e o Futuro dos Bancos de Dados Relacionais Escaláveis
    • 12 Regras Essenciais para Reduzir a Latência de Aplicações
    • Cache Hit Ratio: Como uma Simples Métrica Pode Revolucionar sua Arquitetura
    • Como a Uber calcula o tempo estimado de chegada
    • 30 APIs Gratuitas para desenvolvedores
    • Por que escalar escrita é tão mais difícil do que escalar leitura?
    • MongoDB Analyzer para .NET: Visualize e otimize suas consultas de forma simples
    Facebook X (Twitter) Instagram
    Código Simples .NETCódigo Simples .NET
    Código Simples .NETCódigo Simples .NET
    Home»Asp.net»C#»Entendendo o ObjectId no MongoDB

    Entendendo o ObjectId no MongoDB

    Jhonathan SoaresBy Jhonathan Soares25 de maio de 20246 Mins Read C#
    Share
    Facebook Twitter LinkedIn WhatsApp Copy Link

    Introdução

    Quando você insere um documento no MongoDB, o banco de dados gera automaticamente um identificador único para esse documento, conhecido como ObjectId. Esse identificador é fundamental para a indexação e recuperação eficiente dos dados. O ObjectId é composto por 24 caracteres hexadecimais e, à primeira vista, pode parecer complexo. No entanto, cada parte do ObjectId tem um propósito específico e útil.

    Estrutura do ObjectId

    O ObjectId é composto por três partes principais, que juntas garantem a unicidade e a eficiência da identificação dos documentos:

    • Primeiros 4 bytes: Representam o timestamp de criação.
    • Próximos 5 bytes: São gerados aleatoriamente para garantir a exclusividade por processo da máquina.
    • Últimos 3 bytes: São um contador incremental iniciado a partir de um número aleatório.

    Para ilustrar, vamos considerar o ObjectId 6613f6c8 0265879fc6 eea1a2. Vamos decompor esse identificador:

    Timestamp de Criação (Primeiros 4 bytes)

    No exemplo 6613f6c8 , esses primeiros 4 bytes representam o timestamp de criação do documento. Esse valor é derivado do número de segundos desde a época Unix (01/01/1970). Isso significa que o timestamp não apenas ajuda a garantir a unicidade, mas também permite determinar a data e hora de criação do documento.

    Identificador de Máquina e Processo (Próximos 5 bytes)

    Os bytes 0265879fc6 representam uma combinação gerada aleatoriamente que identifica o processo de criação do ObjectId. Esses bytes garantem que, mesmo que dois documentos sejam criados ao mesmo tempo em processos diferentes, eles ainda terão ObjectIds distintos. Essa exclusividade é crucial em ambientes distribuídos, onde múltiplos processos podem estar inserindo documentos simultaneamente.

    Contador Incremental (Últimos 3 bytes)

    Os últimos 3 bytes eea1a2 são um contador incremental. Esse contador começa a partir de um número aleatório para cada processo e incrementa com cada novo ObjectId gerado. Isso ajuda a garantir que, mesmo que dois documentos sejam criados no mesmo segundo pelo mesmo processo, eles ainda terão ObjectIds únicos.

    Unicidade do ObjectId

    A combinação dessas três partes torna extremamente improvável que dois ObjectIds idênticos sejam gerados. A inclusão do timestamp, identificador de máquina e processo, e o contador incremental criam um sistema robusto para geração de identificadores únicos.

    Exemplos Práticos

    Gerar um Novo ObjectId

    Para gerar um novo ObjectId em .NET, use a classe ObjectId sem argumentos:

    using MongoDB.Bson;
    
    ObjectId x = ObjectId.GenerateNewId();
    Console.WriteLine(x);  // Exemplo de saída: ObjectId("507f1f77bcf86cd799439011")
    
    ObjectId y = new ObjectId("507f191e810c19729de860ea");
    Console.WriteLine(y);  // Exemplo de saída: ObjectId("507f191e810c19729de860ea")
    
    string hexString = new ObjectId("507f191e810c19729de860ea").ToString();
    Console.WriteLine(hexString);  // Exemplo de saída: "507f191e810c19729de860ea"
    
    ObjectId newObjectId = new ObjectId(32, 0, 0);
    Console.WriteLine(newObjectId);  // Exemplo de saída: ObjectId("00000020f51bb4362eee2a4d")
    

    Os resultados mostrados no Console.WriteLine exibem os ObjectIds gerados:

    ObjectId x = ObjectId.GenerateNewId(); Console.WriteLine(x); // Exemplo de saída: ObjectId("507f1f77bcf86cd799439011")
    ObjectId y = new ObjectId("507f191e810c19729de860ea"); Console.WriteLine(y); // Exemplo de saída: ObjectId("507f191e810c19729de860ea")
    string hexString = new ObjectId("507f191e810c19729de860ea").ToString(); Console.WriteLine(hexString); // Exemplo de saída: "507f191e810c19729de860ea"
    ObjectId newObjectId = new ObjectId(32, 0, 0); Console.WriteLine(newObjectId); // Exemplo de saída: ObjectId("00000020f51bb4362eee2a4d")

    Os primeiros quatro bytes do ObjectId são o número de segundos desde a época Unix. Neste exemplo, 32 segundos, representados em hexadecimal como 00000020, são adicionados. Um elemento aleatório de cinco bytes e um contador de três bytes compõem o restante do ObjectId.

    Criando ObjectId’s customizados

    No MongoDB, você pode definir manualmente o identificador (_id) de um documento, incluindo o uso de qualquer formato ou tipo de dado que você desejar, como strings, números inteiros, ou objetos mais complexos. Isso significa que, tecnicamente, você pode usar um CPF (Cadastro de Pessoas Físicas) como o identificador de um documento. No entanto, há algumas considerações importantes a serem feitas:

    1. Unicidade: Você deve garantir que os CPFs usados como IDs sejam únicos em toda a coleção. CPFs duplicados como _id resultariam em erros ao tentar inserir documentos com a mesma chave primária.
    2. Formato e Validação: Certifique-se de que o CPF esteja sempre em um formato consistente e, preferencialmente, validado antes de ser usado como um identificador.
    3. Impacto na Performance: O uso de identificadores personalizados pode ter impacto na performance dependendo do tamanho e complexidade dos mesmos.

    Aqui está um exemplo de como você poderia usar um CPF como _id em um documento MongoDB utilizando .NET:

    using MongoDB.Bson;
    using MongoDB.Driver;
    using MongoDB.Bson.Serialization.Attributes;
    using System;
    
    public class Program
    {
        public class Pessoa
        {
            [BsonId]
            public string Id { get; set; }  // Usando CPF como _id
            public string Nome { get; set; }
            public int Idade { get; set; }
        }
    
        public static void Main(string[] args)
        {
            var client = new MongoClient("mongodb://localhost:27017");
            var database = client.GetDatabase("meuBancoDeDados");
            var collection = database.GetCollection<Pessoa>("pessoas");
    
            var pessoa = new Pessoa
            {
                Id = "12345678909",  // CPF como _id
                Nome = "João Silva",
                Idade = 30
            };
    
            collection.InsertOne(pessoa);
            Console.WriteLine("Documento inserido com sucesso!");
    
            var result = collection.Find(p => p.Id == "12345678909").FirstOrDefault();
            Console.WriteLine($"Encontrado: {result.Nome}, Idade: {result.Idade}");
        }
    }
    

    Explicação do Código

    1. Classe Pessoa com Atributo [BsonId]:
      • A propriedade Id é decorada com o atributo [BsonId], indicando ao driver do MongoDB que essa propriedade deve ser usada como o campo _id no documento MongoDB.
    2. Conexão com o MongoDB:
      • O MongoClient se conecta ao MongoDB.
      • O banco de dados meuBancoDeDados e a coleção pessoas são obtidos.
    3. Inserção de Documento:
      • Um objeto Pessoa é criado com o CPF como Id.
      • O documento é inserido na coleção.
    4. Consulta de Documento:
      • A função Find é usada para buscar o documento com o CPF fornecido como Id.
      • Os detalhes do documento encontrado são exibidos no console.

    Considerações Adicionais

    • Unicidade: Garantir que cada CPF usado como _id é único na coleção.
    • Formato Consistente: Armazenar o CPF em um formato consistente (string de 11 dígitos sem pontos ou traços).

    Considerações Finais

    Embora seja possível criar IDs de forma manual no MongoDB, essa prática não é recomendada devido ao risco de colisões e à perda dos benefícios fornecidos pela geração automática de ObjectIds. A geração automática garante a unicidade e eficiência no gerenciamento dos dados, aspectos críticos para o desempenho e escalabilidade do MongoDB. Caso crie, recomendo fortemente criar um índice único para garantir consistência neste banco de dados.

    Conclusão

    O ObjectId do MongoDB é uma parte essencial da estrutura do banco de dados, projetada para garantir a unicidade e a eficiência na indexação e recuperação de documentos. Entender a estrutura e o funcionamento do ObjectId pode ajudar os desenvolvedores a aproveitar ao máximo as capacidades do MongoDB e a construir aplicações mais robustas e escaláveis.

    Se você deseja saber mais sobre o ObjectId e outros aspectos do MongoDB, confira a documentação oficial.

    Share. Facebook Twitter LinkedIn Telegram WhatsApp Copy Link
    Jhonathan Soares
    • Website
    • Facebook
    • X (Twitter)
    • LinkedIn

    Criador do blog Código Simples e com mais 15 anos de experiência em TI, com títulos de MVP Microsoft na área de Visual Studio Development, Neo4j Top 50 Certificate, Scrum Master e MongoDB Evangelist.

    Posts Relacionados

    MongoDB Analyzer para .NET: Visualize e otimize suas consultas de forma simples

    NoSql 7 de fevereiro de 20255 Mins Read

    Cardinalidade: O Conceito que Transforma o Desempenho de Bancos de Dados SQL e NoSQL

    NoSql Sql 14 de janeiro de 20257 Mins Read

    O que é a Ecma e qual é sua relação com C#?

    C# Post do Leitor 29 de julho de 20247 Mins Read
    Newsletter

    Digite seu endereço de e-mail para receber notificações de novas publicações por e-mail.

    Junte-se a 25mil outros assinantes
    Posts recentes
    • Processamento Assíncrono: Os Desafios da Escalabilidade
    • NewSQL em 2025: O Estado Atual, Tendências e o Futuro dos Bancos de Dados Relacionais Escaláveis
    • 12 Regras Essenciais para Reduzir a Latência de Aplicações
    • Cache Hit Ratio: Como uma Simples Métrica Pode Revolucionar sua Arquitetura
    • Como a Uber calcula o tempo estimado de chegada
    Categorias
    • Arquitetura (15)
      • Testes (2)
    • Asp.net (120)
      • C# (89)
      • Mvc (13)
    • Banco de dados (90)
      • NoSql (58)
      • Sql (38)
    • Boas práticas (29)
      • Gestão & Produtividade (1)
      • Metodologias Ágeis (6)
    • Cursos (52)
    • Dicas (105)
    • Front-End (92)
    • IA (1)
    • Linux (6)
    • NodeJS (4)
    • Post do Leitor (9)
    • Python (5)
    • Seo (12)
    • Tecnologia (30)
      • ITIL (1)
      • Padrões de Projeto (4)
    • Testes (2)

    VEJA TAMBÉM

    Cursos
    12 de fevereiro de 20166 Mins Read

    1000 livros gratuitos sobre programação!

    Olha que dica bacana! A pagina só com livros sobre programação é mantida no GitHub…

    30 APIs Gratuitas para desenvolvedores

    Facebook X (Twitter) Instagram LinkedIn

    Type above and press Enter to search. Press Esc to cancel.

    Vá para versão mobile