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
_idautomaticamente, 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
Validador de ObjectId Genérico
Valida formatos de ObjectId genéricos usados em diferentes bancos NoSQL: MongoDB (24 hex), Couchbase (UUID), Cassandra (TimeUUID).
Validador de RENAVAM
Valide números de RENAVAM pelo algoritmo oficial do DENATRAN, sem enviar dados para servidores. Gratuito e sem cadastro.
Validador de IBAN Alemanha
Valida IBANs alemães (DE) — 22 caracteres com BLZ (8 dígitos) e número de conta. Usa o algoritmo mod-97 padrão para IBAN.