tinycoll

A minimal reactive document store with Mongo-like querying, reactivity, TTL support, and optional persistence (IndexedDB or filesystem).

Features

  • Reactive find, findOne, count
  • Mongo-style query matcher ($eq, $gt, $in, $or, etc.)
  • Custom TTL indexes (per Mongo’s expireAfterSeconds style)
  • Optional IndexedDB or file persistence
  • Fast Map-based internal storage
  • Signal-based reactivity with @preact/signals-core

Installation

npm i tinycoll

Usage

Create a collection

const users = new Collection('users');

With persistence

const users = new Collection('users', { storage: indexedDbStorage });

const users = new Collection('users', {
  storage: createFileStorage('./users.json'),
});

Insert

users.insert({ name: 'Stephan', city: 'Leeuwarden' });

Query

// `find()` returns a ReactiveCursor. Supports projection, sorting, and reactivity.
const results = users.find({ city: 'Leeuwarden' }, {
  sort: { name: 1 },
  projection: { name: 1 },
});

effect(() => {
  console.log(results.toArray());
});

Reactive results support .toArray(), .map(), .watch(), and pagination helpers like .paginate(page, perPage).

TTL Index

new Collection('sessions', {
  ttlIndexes: [
    {
      field: 'lastAccessedAt',
      expireAfterSeconds: 3600,
    },
  ],
});