mongodb

SKILL.md

MongoDB Skill

MongoDB is the document store for Sorcha's Register Service, providing storage for registers, transactions, dockets, and system blueprints. The codebase uses a two-tier storage architecture: warm-tier (mutable IDocumentStore<T>) and cold-tier (immutable IWormStore<T> for WORM/ledger data).

Quick Start

Connection Setup

// Program.cs - Register Service
builder.Services.AddSingleton<IMongoClient>(sp =>
{
    var connectionString = builder.Configuration.GetConnectionString("MongoDB") 
        ?? "mongodb://localhost:27017";
    return new MongoClient(connectionString);
});

builder.Services.AddSingleton<IMongoDatabase>(sp =>
{
    var client = sp.GetRequiredService<IMongoClient>();
    return client.GetDatabase("sorcha_register");
});

Repository Registration

// Use extension method from Sorcha.Storage.MongoDB
builder.Services.AddMongoClient(builder.Configuration);
builder.Services.AddMongoDatabase("sorcha_register");
builder.Services.AddMongoDocumentStore<Blueprint, string>(
    "blueprints",
    doc => doc.Id,
    doc => doc.Id
);

Key Concepts

Concept Usage Example
Filter Builders Type-safe queries Builders<T>.Filter.Eq(x => x.Id, id)
Update Builders Atomic updates Builders<T>.Update.Set(x => x.Height, 10)
Composite Indexes Multi-field queries IndexKeys.Ascending(x => x.RegisterId).Ascending(x => x.TxId)
WORM Store Immutable ledger data IWormStore<Transaction, string> - no updates/deletes
Document Store Mutable documents IDocumentStore<Blueprint, string> - full CRUD

Common Patterns

Filtered Query with Pagination

var filter = Builders<TransactionModel>.Filter.And(
    Builders<TransactionModel>.Filter.Eq(t => t.RegisterId, registerId),
    Builders<TransactionModel>.Filter.Gte(t => t.TimeStamp, since)
);

var results = await _collection
    .Find(filter)
    .SortByDescending(t => t.TimeStamp)
    .Skip(page * pageSize)
    .Limit(pageSize)
    .ToListAsync(cancellationToken);

Array Element Query

// Find transactions where address is in RecipientsWallets array
var filter = Builders<TransactionModel>.Filter.AnyEq(
    t => t.RecipientsWallets, 
    walletAddress
);

See Also

Related Skills

  • dotnet - Runtime and C# patterns
  • entity-framework - Alternative ORM (PostgreSQL uses EF)
  • redis - Caching layer integration
  • docker - MongoDB container setup
  • xunit - Integration tests with Testcontainers

Documentation Resources

Fetch latest MongoDB C# driver documentation with Context7.

How to use Context7:

  1. Use mcp__context7__resolve-library-id to search for "mongodb c# driver"
  2. Query with mcp__context7__query-docs using the resolved library ID

Library ID: /mongodb/mongo-csharp-driver

Recommended Queries:

  • "filter builder examples CRUD operations"
  • "BSON serialization attributes"
  • "index creation async"
  • "aggregation pipeline C#"
Weekly Installs
23
First Seen
Jan 27, 2026
Installed on
cursor23
gemini-cli22
continue21
opencode21
codebuddy21
github-copilot21