Documentação
Introdução
O sorla-db é um banco de dados de documentos que vive na memória, no navegador ou no Node. Você guarda objetos JavaScript comuns, faz consultas com a linguagem de consulta do MongoDB que talvez você já conheça, e ainda ganha validação por schema, eventos de mudança, consultas vivas para React / Vue / Svelte / Angular, integração com formulários e carregamento a partir de um backend via Server-Sent Events ou WebSocket. Sem servidor, sem configuração, sem dependências.
const sorla = require('sorla-db');
const app = new sorla();
app.useDb('shop');
app.db.createCollection('products');
app.db.products.insertMany([
{ name: 'Coffee', price: 12.5, tags: ['hot'] },
{ name: 'Tea', price: 8, tags: ['hot', 'herbal'] },
{ name: 'Juice', price: 9.9, tags: ['cold'] }
]);
app.db.products.find({ price: { $lt: 10 } }).sort({ price: 1 }).toArray();
// [{ _id: '…', name: 'Tea', price: 8, … }, { _id: '…', name: 'Juice', price: 9.9, … }]
Por que os desenvolvedores escolhem o sorla-db
- Familiar.
find,updateOne,$in,$regex,$set,bulkWrite… O vocabulário do MongoDB, então há pouco a aprender e as consultas podem ser compartilhadas com um backend MongoDB. - Seguro por padrão. Você sempre recebe cópias; os documentos guardados não podem ser alterados por acidente. Os lotes são validados antes de qualquer gravação.
- Rápido. Um índice de
_id, cursores que copiam só o que você lê, atualizações que copiam só o que mudou. 100 000 documentos rodam com folga. - Reativo.
watch()mantém uma consulta sempre atualizada, e as integrações a transformam em um hook do React, um ref do Vue, uma store do Svelte ou um signal do Angular. - Conectado. Carregue um milhão de linhas em blocos via Server-Sent Events, ou pagine e receba mudanças ao vivo por um WebSocket.
- Pequeno. Um único arquivo de 54 kB para o navegador, ou um pacote CommonJS / ES module com tipos TypeScript.
Instalação
npm
npm install sorla-db
// CommonJS (Node, bundlers mais antigos)
const sorla = require('sorla-db');
// ES modules (Vite, webpack, esbuild, Node com "type": "module")
import sorla from 'sorla-db';
// ou: import { sorla } from 'sorla-db';
Uma tag script, sem etapa de build
<script src="https://cdn.jsdelivr.net/npm/sorla-db@1/dist/sorla.min.js"></script>
<script>
const app = new window.sorla(); // o bundle registra a classe como window.sorla
app.useDb('demo');
</script>
O mesmo arquivo está em node_modules/sorla-db/dist/sorla.min.js, caso você mesmo queira servi-lo.
O unpkg também funciona: https://unpkg.com/sorla-db@1/dist/sorla.min.js.
Integrações com frameworks
As integrações fazem parte do pacote; instale o framework que você usa normalmente.
import { useQuery } from 'sorla-db/react'; // React 18+
import { useQuery } from 'sorla-db/vue'; // Vue 3.3+
import { query } from 'sorla-db/svelte'; // Svelte 3, 4, 5
import { querySignal } from 'sorla-db/angular'; // Angular 16+
Veja Consultas vivas e frameworks.
Requisitos
| Ambiente | Versão |
|---|---|
| Navegadores | qualquer navegador atual (ES2020) |
| Node | 18 ou superior (fetch, ReadableStream, structuredClone); a suíte de testes roda no Node 24 |
| TypeScript | declarações incluídas (index.d.ts) |
Seus primeiros cinco minutos
const app = new sorla();
// 1. um banco: useDb cria o banco quando necessário e o seleciona
app.useDb('todo');
// 2. uma coleção, opcionalmente com um schema
app.db.createCollection('tasks', {
required: ['title'],
properties: {
title: { type: 'string', minLength: 1 },
done: { type: 'boolean', default: false },
due: { type: ['string', 'null'], format: 'date' }
}
});
const tasks = app.db.tasks;
// 3. inserir: são guardadas cópias, e os ids são gerados (uuid v4), a menos que você informe o _id
const id = tasks.insertOne({ title: 'Write the docs', due: '2026-11-01' });
tasks.insertMany([{ title: 'Ship it' }, { title: 'Celebrate', due: '2026-11-02' }]);
// 4. consultar
tasks.find({ done: false }).sort({ due: 1 }).toArray();
tasks.findOne({ _id: id }); // { _id, title: 'Write the docs', done: false, due: '2026-11-01' }
tasks.count({ due: { $exists: true } });
// 5. alterar e reagir
tasks.on('change', event => console.log(event.type, event.ids));
tasks.updateOne({ _id: id }, { $set: { done: true } }); // exibe: update [id]
tasks.deleteMany({ done: true }); // exibe: delete [id]
A ordenação coloca os valores ausentes e null por último (o due acima), nas duas direções. Isso é
configurável, veja Cursores.
Para onde ir agora
| Eu quero… | Leia |
|---|---|
| organizar os dados em bancos e coleções | Bancos de dados e coleções |
| entender ids, cópias e o que pode ser guardado | Documentos e inserção |
| escrever consultas | Consultas |
| ordenar, paginar, projetar e ler resultados | Cursores |
| alterar e remover dados, inclusive em massa | Atualizando e excluindo |
| rejeitar dados inválidos | Validação por schema |
| conectar um formulário HTML | Formulários |
| reagir a mudanças | Eventos e Consultas vivas |
| carregar dados de um backend | Sincronização com o servidor: SSE e WebSocket |
| explorar pelo console do navegador | Usando o console |
| tipar tudo | TypeScript |
| lidar com muitos dados | Desempenho |
| rodar os testes ou contribuir | Testes e desenvolvimento |
| copiar uma receita pronta | Receitas e perguntas frequentes |