https://github.com/loresoft/mongodb.abstracts
MongoDB abstract repository pattern
https://github.com/loresoft/mongodb.abstracts
generic-mongodb-queries mongodb repository-pattern
Last synced: 8 months ago
JSON representation
MongoDB abstract repository pattern
- Host: GitHub
- URL: https://github.com/loresoft/mongodb.abstracts
- Owner: loresoft
- License: mit
- Created: 2016-04-17T03:57:30.000Z (almost 10 years ago)
- Default Branch: master
- Last Pushed: 2025-06-05T07:32:47.000Z (8 months ago)
- Last Synced: 2025-06-06T20:57:52.359Z (8 months ago)
- Topics: generic-mongodb-queries, mongodb, repository-pattern
- Language: C#
- Homepage:
- Size: 240 KB
- Stars: 9
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
README
# MongoDB.Abstracts
## Overview
The MongoDB Abstracts library defines abstract base classes for repository pattern.
[](https://github.com/loresoft/MongoDB.Abstracts/actions)
[](https://www.nuget.org/packages/MongoDB.Abstracts/)
[](https://coveralls.io/github/loresoft/MongoDB.Abstracts?branch=master)
## Download
The MongoDB.Abstracts library is available on nuget.org via package name `MongoDB.Abstracts`.
To install MongoDB.Abstracts, run the following command in the Package Manager Console
PM> Install-Package MongoDB.Abstracts
More information about NuGet package available at
### Features
* interface for generic MongoDB queries; `IMongoQuery`
* interface for generic MongoDB repository; `IMongoRepository`
* base class for generic MongoDB queries; `MongoQuery`
* base class for generic MongoDB repository; `MongoRepository`
* interface for generic MongoDB entity; `IMongoEntity`
* base class for generic MongoDB entity; `MongoEntity`
* interface for generic MongoDB entity repository; `IMongoEntityRepository`
* base class for generic MongoDB entity repository; `MongoEntityRepostiory`
### Configuration
Register with dependency injection
```c#
services.AddMongoRepository("mongodb://localhost:27017/UnitTesting");
```
Register using a connection name from the appsettings.json
```c#
services.AddMongoRepository("UnitTesting");
```
```json
{
"ConnectionStrings": {
"UnitTesting": "mongodb://localhost:27017/UnitTesting"
}
}
```
#### Discriminators
Register with discriminator type for support for multiple connections. This is a similar concept to dependency injection with keyed services.
Simple types used to discriminate connections
```c#
public readonly struct ProductsConnection;
public readonly struct InventoryConnection;
```
Register the MongoDB connections using the discriminators
```c#
services.AddMongoRepository("ProductsConnection");
services.AddMongoRepository("InventoryConnection");
```
Connection string in appsettings.json
```json
{
"ConnectionStrings": {
"ProductsConnection": "mongodb://localhost:27017/Products",
"InventoryConnection": "mongodb://localhost:27017/Inventory"
}
}
```
Inject into constructor
```c#
public class ProductService
{
private readonly IMongoEntityRepository _repository;
public ProductService(IMongoEntityRepository repository)
{
_repository = repository;
}
}
public class InventoryService
{
private readonly IMongoEntityRepository _repository;
public InventoryService(IMongoEntityRepository repository)
{
_repository = repository;
}
}
```
### Usage
Find an entity by key
```c#
// dependency inject
var roleRepo = Services.GetRequiredService>();
// find by key
var role = await roleRepo.FindAsync("67a0dc52fa5ebe49f293a374");
```
Find one entity with query
```c#
// dependency inject
var roleRepo = Services.GetRequiredService>();
// find one by query expression
var role = await roleRepo.FindOneAsync(r => r.Name.StartsWith("Admin"))
```
Find many with query
```c#
// dependency inject
var roleRepo = Services.GetRequiredService>();
// find one by query expression
var roles = await roleRepo.FindAllAsync(r => r.Name.StartsWith("Admin"))
```
Use `IQueryable`
```c#
// dependency inject
var roleRepo = Services.GetRequiredService>();
// Use IQueryable
var roles = roleRepo.All()
.Where(r => r.IsActive)
.ToList();
```
Insert entity
```c#
// dependency inject
var roleRepo = Services.GetRequiredService>();
var role = new Role { Name = "CreateReadRole" };
var createdRole = await roleRepo.InsertAsync(role);
```
Update entity
```c#
// dependency inject
var roleRepo = Services.GetRequiredService>();
// find by key
var role = await roleRepo.FindAsync("67a0dc52fa5ebe49f293a374");
// make changes
role.Name = "UpdateRole";
var updateRole = await roleRepo.UpdateAsync(role);
```
Delete entity by key
```c#
// dependency inject
var roleRepo = Services.GetRequiredService>();
// items deleted
var count = await roleRepo.DeleteAsync("67a0dc52fa5ebe49f293a374");
```
### Overrides
Create a custom repository
```c#
public class UserRepository : MongoEntityRepository
{
public UserRepository(IMongoDatabase mongoDatabase) : base(mongoDatabase)
{
}
protected override void BeforeInsert(Models.User entity)
{
base.BeforeInsert(entity);
entity.EmailLower = entity.Email?.ToLowerInvariant();
}
protected override void BeforeUpdate(Models.User entity)
{
base.BeforeUpdate(entity);
entity.EmailLower = entity.Email?.ToLowerInvariant();
}
protected override void EnsureIndexes(IMongoCollection mongoCollection)
{
base.EnsureIndexes(mongoCollection);
mongoCollection.Indexes.CreateOne(
new CreateIndexModel(
Builders.IndexKeys.Ascending(s => s.EmailLower),
new CreateIndexOptions { Unique = true }
)
);
}
}
```