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()
- TypeScript
- JavaScript
import { LioranClient } from "@liorandb/driver";
const client = new LioranClient("http://localhost:4000");
await client.login("admin", "admin");
console.log(await client.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?)
- TypeScript
- JavaScript
console.log(await client.countDatabases()); // all visible DBs
console.log(await client.countDatabases("admin")); // for a specific owner userId
console.log(await client.countDatabases()); // all visible DBs
console.log(await client.countDatabases("admin")); // for a specific owner userId
listUserDatabases(userId)
- TypeScript
- JavaScript
console.log(await client.listUserDatabases("admin"));
console.log(await client.listUserDatabases("admin"));
createDatabase(name | { name; ownerUserId? })
- TypeScript
- JavaScript
console.log(await client.createDatabase("app"));
console.log(await client.createDatabase({ name: "analytics", ownerUserId: "admin" }));
console.log(await client.createDatabase("app"));
console.log(await client.createDatabase({ name: "analytics", ownerUserId: "admin" }));
dropDatabase(name)
- TypeScript
- JavaScript
console.log(await client.dropDatabase("analytics"));
console.log(await client.dropDatabase("analytics"));
databaseStats(name)
- TypeScript
- JavaScript
console.log(await client.databaseStats("app"));
console.log(await client.databaseStats("app"));
Database wrapper (DB)
await client.db(name) returns a DB instance with:
Collections
collection(name)
- TypeScript
- JavaScript
const db = await client.db("app");
const users = db.collection<{ _id?: string; email: string }>("users");
await users.insertOne({ email: "a@b.com" });
const db = await client.db("app");
const users = db.collection("users");
await users.insertOne({ email: "a@b.com" });
listCollections()
- TypeScript
- JavaScript
console.log(await db.listCollections());
console.log(await db.listCollections());
createCollection(name) / dropCollection(name) / renameCollection(old, next)
- TypeScript
- JavaScript
console.log(await db.createCollection("items"));
console.log(await db.renameCollection("items", "inventory"));
console.log(await db.dropCollection("inventory"));
console.log(await db.createCollection("items"));
console.log(await db.renameCollection("items", "inventory"));
console.log(await db.dropCollection("inventory"));
Stats and maintenance
stats()
- TypeScript
- JavaScript
console.log(await db.stats());
console.log(await db.stats());
compactAll() / compactCollection(name)
- TypeScript
- JavaScript
console.log(await db.compactCollection("users"));
console.log(await db.compactAll());
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?)
- TypeScript
- JavaScript
console.log(await db.createIndex("users", "email", { unique: true }));
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)
- TypeScript
- JavaScript
console.log(await db.listIndexes("users"));
console.log(await db.listIndexes("users"));
dropIndex(collection, field)
- TypeScript
- JavaScript
console.log(await db.dropIndex("users", "email"));
console.log(await db.dropIndex("users", "email"));
rebuildIndex(collection, field) / rebuildIndexes(collection)
- TypeScript
- JavaScript
console.log(await db.rebuildIndex("users", "email"));
console.log(await db.rebuildIndexes("users"));
console.log(await db.rebuildIndex("users", "email"));
console.log(await db.rebuildIndexes("users"));
explain(collection, query?, options?)
- TypeScript
- JavaScript
const explain = await db.explain("users", { email: "a@b.com" }, { limit: 1 });
console.log(explain);
const explain = await db.explain("users", { email: "a@b.com" }, { limit: 1 });
console.log(explain);
Transactions
transaction(ops[])
- TypeScript
- JavaScript
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 }] },
]);
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)
- TypeScript
- JavaScript
await db.transaction(async (tx) => {
await tx.collection("audit").insertOne({ at: Date.now(), event: "purchase" });
});
await db.transaction(async (tx) => {
await tx.collection("audit").insertOne({ at: Date.now(), event: "purchase" });
});
Database credentials (connection strings)
getCredentials()
- TypeScript
- JavaScript
console.log(await db.getCredentials());
console.log(await db.getCredentials());
setCredentials({ username, password })
- TypeScript
- JavaScript
console.log(await db.setCredentials({ username: "app_user", password: "app_pass_123" }));
console.log(await db.setCredentials({ username: "app_user", password: "app_pass_123" }));
getConnectionString()
- TypeScript
- JavaScript
console.log(await db.getConnectionString());
console.log(await db.getConnectionString());