Skip to main content

Databases

The driver provides both:

  • management APIs (client.*) and
  • database scoped APIs (await client.db(name))

Related pages:

  • Collections for collection-level CRUD and streaming bulk inserts
  • Schemas & migrations for schema versions and doc migration workflows

Management (LioranClient)​

Requires authentication.

listDatabases()​

import { LioranClient } from "@liorandb/driver";

const client = new LioranClient("http://localhost:4000");
await client.login("admin", "admin");

console.log(await client.listDatabases());

countDatabases(userId?)​

console.log(await client.countDatabases()); // all visible DBs
console.log(await client.countDatabases("admin")); // for a specific owner userId

listUserDatabases(userId)​

console.log(await client.listUserDatabases("admin"));

createDatabase(name | { name; ownerUserId? })​

console.log(await client.createDatabase("app"));
console.log(await client.createDatabase({ name: "analytics", ownerUserId: "admin" }));

dropDatabase(name)​

console.log(await client.dropDatabase("analytics"));

databaseStats(name)​

console.log(await client.databaseStats("app"));

Database wrapper (DB)​

await client.db(name) returns a DB instance with:

Collections​

collection(name)​

const db = await client.db("app");
const users = db.collection<{ _id?: string; email: string }>("users");
await users.insertOne({ email: "a@b.com" });

listCollections()​

console.log(await db.listCollections());

createCollection(name) / dropCollection(name) / renameCollection(old, next)​

console.log(await db.createCollection("items"));
console.log(await db.renameCollection("items", "inventory"));
console.log(await db.dropCollection("inventory"));

Stats and maintenance​

stats()​

console.log(await db.stats());

compactAll() / compactCollection(name)​

console.log(await db.compactCollection("users"));
console.log(await db.compactAll());

Schema versions and migrations​

The server can store a database schema version (a string) and can apply structured migrations.

getSchemaVersion() / setSchemaVersion(schemaVersion)​

console.log(await db.getSchemaVersion()); // string | null
console.log(await db.setSchemaVersion("2026-05-16"));

applyMigrations(targetVersion, migrations)​

The remote driver intentionally does not support a function-based db.migrate() API.

Use applyMigrations(...) instead:

await db.applyMigrations("v2", [
{
from: "v1",
to: "v2",
actions: [
{ type: "createIndex", collection: "users", field: "email", options: { unique: true } },
],
},
]);

rotateEncryptionKey(newKey)​

If your server is configured to support it:

await db.rotateEncryptionKey("<new-key>");

Collection options (database-scoped admin APIs)​

These methods operate on a collection by name (without needing a Collection instance):

  • getCollectionOptions(collection)
  • setCollectionDateOption(collection, date)
console.log(await db.getCollectionOptions("users"));
await db.setCollectionDateOption("users", { mode: "epoch_ms" });

Indexes​

createIndex(collection, field, options?)​

console.log(await db.createIndex("users", "email", { unique: true }));

createTextIndex(collection, field, options?)​

await db.createTextIndex("posts", "title", { normalize: true });

Text search is performed via the $text query operator on collection methods like find() / findOne():

const posts = db.collection("posts");
console.log(await posts.find({ $text: { $search: "hello world" } }, { limit: 10 }));

listIndexes(collection)​

console.log(await db.listIndexes("users"));

dropIndex(collection, field)​

console.log(await db.dropIndex("users", "email"));

rebuildIndex(collection, field) / rebuildIndexes(collection)​

console.log(await db.rebuildIndex("users", "email"));
console.log(await db.rebuildIndexes("users"));

explain(collection, query?, options?)​

const explain = await db.explain("users", { email: "a@b.com" }, { limit: 1 });
console.log(explain);

Transactions​

transaction(ops[])​

await db.transaction([
{ col: "accounts", op: "updateOne", args: [{ id: "a" }, { $inc: { balance: -50 } }, { upsert: true }] },
{ col: "accounts", op: "updateOne", args: [{ id: "b" }, { $inc: { balance: 50 } }, { upsert: true }] },
]);

transaction(fn)​

await db.transaction(async (tx) => {
await tx.collection("audit").insertOne({ at: Date.now(), event: "purchase" });
});

Database credentials (connection strings)​

getCredentials()​

console.log(await db.getCredentials());

setCredentials({ username, password })​

console.log(await db.setCredentials({ username: "app_user", password: "app_pass_123" }));

getConnectionString()​

console.log(await db.getConnectionString());