Documentação
Introdução
Um documento é um objeto comum: strings, números, booleanos, null, arrays, objetos aninhados e
objetos Date. Todo documento tem um _id.
{
_id: '6f1c…', // gerado, ou o seu
name: 'Coffee',
price: 12.5,
tags: ['hot'],
supplier: { name: 'Fazenda Boa', city: 'Patrocínio' },
createdAt: new Date()
}
Regras para documentos
| Regra | O que acontece se não for cumprida |
|---|---|
O documento é um objeto (não um array, nem null) |
Error: Invalid document type |
Nenhuma chave contém $ ou ., em qualquer nível |
Error: Invalid document keys ($ inicia operadores, . separa caminhos) |
| Os valores podem ser clonados: nada de funções, nós do DOM ou instâncias de classe com estado privado | Error: Documents can only contain cloneable values (no functions or DOM nodes) |
O _id é único na coleção |
Error: Duplicate _id "…" |
| O schema, quando a coleção tem um, é respeitado | ValidationError com todos os problemas, veja Validação por schema |
O _id pode ser qualquer valor que você quiser (número, string…). Sem ele, o sorla-db gera uma
string uuid v4.
Cópias em todo lugar
O sorla-db guarda uma cópia do que você insere e entrega cópias quando você lê:
const product = { name: 'Coffee', tags: ['hot'] };
const id = products.insertOne(product);
product.tags.push('changed'); // o seu objeto: a coleção não vê a mudança
const copy = products.findOne({ _id: id });
copy.tags.push('also changed'); // uma cópia: a coleção também não vê
products.findOne({ _id: id }).tags; // ['hot']
Os objetos que você passa nunca são modificados (o sorla-db não adiciona _id a eles). Os
documentos guardados também nunca são alterados no lugar: uma atualização guarda uma nova versão. É
isso que faz dos cursores snapshots consistentes e permite que as atualizações compartilhem as
partes inalteradas entre versões (veja Desempenho).
insertOne
const id = products.insertOne({ name: 'Coffee', price: 12.5 });
products.insertOne({ _id: 'tea', name: 'Tea' }, id => console.log('stored', id)); // callback opcional
Retorna o _id. Os valores padrão do schema são preenchidos antes da validação (veja
Validação por schema). Emite um evento insert.
insertMany
const ids = products.insertMany([
{ name: 'Tea', price: 8 },
{ name: 'Juice', price: 9.9 }
]);
// ['…', '…']
Tudo ou nada: o array inteiro é verificado primeiro (tipos, chaves, ids duplicados dentro do lote e em relação à coleção, schema), então um único documento inválido faz com que nada seja guardado:
try {
products.insertMany([{ _id: 1, name: 'A' }, { _id: 1, name: 'B' }]);
} catch (error) {
error.message; // 'Duplicate _id "1"'
products.count(); // inalterado
}
Emite um único evento insert para o lote inteiro. O segundo argumento, opcional, é um callback
que recebe os ids. A inserção é linear: 100 000 documentos levam bem menos de um segundo.
Precisa de inserções, atualizações e exclusões numa só chamada? Use
bulkWrite.
Datas
Objetos Date são guardados como datas (copiadas), comparados pelo tempo nas consultas e ordenados
depois dos outros tipos. Muitas aplicações guardam strings ISO no lugar ('2026-11-01'): elas são
ordenadas e comparadas corretamente como texto, e sobrevivem ao JSON.stringify quando você envia
os dados para um servidor.
events.insertOne({ title: 'Launch', at: new Date('2026-11-01T10:00:00Z') });
events.find({ at: { $gte: new Date('2026-11-01') } });
Objetos aninhados e arrays
Valores aninhados são acessados com caminhos com ponto nas consultas, na ordenação e nas atualizações:
products.insertOne({ name: 'Coffee', supplier: { city: 'Patrocínio' }, tags: ['hot', 'strong'] });
products.find({ 'supplier.city': 'Patrocínio' });
products.find({ tags: { $in: ['strong'] } });
products.updateOne({ name: 'Coffee' }, { $set: { 'supplier.city': 'Franca' } });