Skip to content

Advanced Usage

Batch Operations

For atomic operations (max 500 operations).

typescript
const batch = repos.users.batch.create();

batch.set(repos.users.documentRef("user1"), {
  name: "User One",
  email: "user1@example.com",
});

batch.update(repos.users.documentRef("user2"), {
  age: 25,
});

batch.delete(repos.users.documentRef("user3"));

await batch.commit();

Bulk Operations

For processing large amounts of data (automatically split into batches of 500).

typescript
// Bulk Set
await repos.users.bulk.set([
  {
    docRef: repos.users.documentRef("user1"),
    data: { name: "User 1", email: "user1@example.com" },
    merge: true,
  },
  {
    docRef: repos.users.documentRef("user2"),
    data: { name: "User 2", email: "user2@example.com" },
  },
  // ... up to thousands of documents
]);

// Bulk Update
await repos.users.bulk.update([
  { docRef: repos.users.documentRef("user1"), data: { age: 30 } },
  { docRef: repos.users.documentRef("user2"), data: { age: 25 } },
]);

// Bulk Delete
await repos.users.bulk.delete([
  repos.users.documentRef("user1"),
  repos.users.documentRef("user2"),
]);

Real-time Listeners (onSnapshot)

typescript
// Listen for real-time changes
const unsubscribe = repos.users.query.onSnapshot(
  {
    where: [{ field: "isActive", operator: "==", value: true }],
    orderBy: [{ field: "name", direction: "asc" }],
  },
  (users) => {
    console.log("Updated data:", users);
  },
  (error) => {
    console.error("Error:", error);
  }
);

// Stop listening
unsubscribe();

Cursor Pagination

Cursor-based pagination is more efficient than offset for large collections.

typescript
// First page
const firstPage = await repos.users.query.by({
  orderBy: [{ field: "createdAt", direction: "desc" }],
  limit: 10,
});

// Next page using the last document
const lastDoc = firstPage[firstPage.length - 1];
const nextPage = await repos.users.query.by({
  orderBy: [{ field: "createdAt", direction: "desc" }],
  startAfter: lastDoc, // or use an array of values
  limit: 10,
});

Aggregations

typescript
import { count, sum, average } from "@lpdjs/firestore-repo-service";

// Count documents
const activeCount = await repos.users.aggregate.count({
  where: [{ field: "isActive", operator: "==", value: true }],
});

// Custom aggregations (count, sum, average)
const stats = await repos.users.aggregate.query(
  {
    totalUsers: count(),
    totalAge: sum("age"),
    averageAge: average("age"),
  },
  {
    where: [{ field: "isActive", operator: "==", value: true }],
  }
);

console.log(stats.totalUsers); // total count
console.log(stats.totalAge); // sum of ages
console.log(stats.averageAge); // average age