1001Ferramentas
🍃Validadores

Validador de Mongo ObjectId

Valida que uma string é um ObjectId válido do MongoDB: 24 caracteres hexadecimais. Mostra timestamp embutido (4 primeiros bytes).

MongoID no Mongoose: validando o campo _id além do ObjectId puro

MongoID é o nome informal frequentemente usado para o identificador _id no Mongoose, a biblioteca ODM (Object Data Modeling) mais popular para MongoDB em Node.js. Criado por Valeri Karpov na LearnBoost em 2010, o Mongoose adiciona schemas, validação, hooks, virtuals e populate sobre o driver MongoDB nativo — e a forma como ele lida com identificadores de documentos é uma de suas características mais marcantes.

Por padrão, todo documento Mongoose recebe um campo _id autogerado do tipo ObjectId: um valor BSON de 12 bytes representado como uma string hexadecimal de 24 caracteres, como 507f1f77bcf86cd799439011. O Mongoose injeta esse campo implicitamente, a menos que você opte por não tê-lo com _id: false nas opções do schema.

Definindo e customizando _id em um schema Mongoose

Apesar de ObjectId ser o padrão, o Mongoose permite trocar _id por qualquer outro tipo — UUIDs, inteiros, strings de slug ou chaves compostas são escolhas válidas quando a regra de negócio exige.

const userSchema = new Schema({
  _id: { type: Schema.Types.ObjectId, default: () => new mongoose.Types.ObjectId() },
  email: String
});

// _id string custom (ex: slug):
const articleSchema = new Schema({ _id: String, title: String });

Use ref: 'User' em um campo referenciado para declarar a relação e em seguida .populate('user') na consulta para resolver o _id estrangeiro no documento completo — o padrão canônico do Mongoose para joins entre coleções.

Validando um MongoID: ObjectId.isValid() e suas armadilhas

A checagem oficial é mongoose.Types.ObjectId.isValid(str), que retorna true quando a entrada pode ser convertida em ObjectId. Atenção ao clássico pegadinha: isValid() também retorna true para qualquer string de 12 caracteres (porque 12 bytes é também um tamanho binário legal de ObjectId). Código em produção que só aceita o formato de 24 hex deve combinar com uma checagem explícita por regex:

function isValidMongoId(s) {
  return typeof s === 'string'
      && /^[a-fA-F0-9]{24}$/.test(s)
      && mongoose.Types.ObjectId.isValid(s);
}

Geração no cliente, segurança e paralelos com UUID v7

ObjectIds podem ser gerados tanto no cliente (o driver MongoDB faz isso por padrão antes dos inserts) quanto no servidor. A geração no cliente é aceitável para IDs não-críticos do ponto de vista de segurança, porque o prefixo de timestamp e o contador não são segredos — mas nunca exponha ObjectIds em URLs públicas de recursos onde a previsibilidade importa, já que o segmento de timestamp vaza ordem de criação e tempo aproximado.

O padrão (prefixo de timestamp + entropia + contador) é conceitualmente próximo ao UUID v7, padronizado pela RFC 9562 (2024): ambos produzem identificadores aproximadamente ordenáveis no tempo com bits aleatórios no final. Se você está iniciando um projeto novo hoje e quer ordenação cronológica entre stores heterogêneos, UUID v7 é o padrão cross-ecosistema; ObjectId continua sendo o caminho de menor resistência dentro do mundo MongoDB.

Mongoose vs driver nativo do MongoDB para Node.js

  • Mongoose: ODM de mais alto nível — schemas, validators, middleware, virtuals, populate. Injeta _id automaticamente, faz cast de strings para ObjectId.
  • Driver: wrapper fino sobre o wire protocol. Você gerencia cast e validação à mão com new ObjectId(str).
  • MongoDB Atlas: serviço cloud gerenciado da MongoDB Inc. — ambas as libs conectam da mesma forma.
  • Ecossistema Node brasileiro: Mongoose é a escolha dominante na stack BR — a maioria dos tutoriais, cursos e bases em produção usa ele.

FAQ

Mongoose vs driver MongoDB — qual valida o _id?

Os dois expõem ObjectId.isValid(), mas o Mongoose ainda faz cast automático via schema — se você declara type: ObjectId, strings são convertidas e rejeitadas via CastError quando malformadas. O driver deixa tudo isso para o seu código.

O cliente pode gerar um ObjectId?

Sim — é inclusive o padrão no driver Node.js. new mongoose.Types.ObjectId() no cliente produz um ID válido que o servidor aceita. Evite só quando a confidencialidade do ID for requisito de segurança.

Existem pegadinhas no ObjectId.isValid()?

Sim — retorna true para qualquer string de 12 caracteres, porque elas mapeiam para 12 bytes brutos. Se o seu contrato de API é "24 caracteres hex", combine a checagem com uma regex como /^[a-fA-F0-9]{24}$/.

Por que 24 caracteres hexadecimais?

Um ObjectId tem 12 bytes (96 bits). Cada byte vira 2 dígitos hexadecimais, totalizando 24 caracteres: 4 bytes de timestamp, 5 bytes de valor aleatório por processo e 3 bytes de contador incremental.

Posso usar UUID no lugar de ObjectId no Mongoose?

Sim — declare _id: { type: String, default: () => crypto.randomUUID() } (ou use libs de UUID v7 / Buffer) no seu schema. Você perde a ordenabilidade nativa do ObjectId, mas ganha um identificador cross-platform.

Ferramentas Relacionadas