{"id":22882347,"url":"https://github.com/loresoft/mongodb.abstracts","last_synced_at":"2025-06-13T11:37:06.303Z","repository":{"id":7450726,"uuid":"56418023","full_name":"loresoft/MongoDB.Abstracts","owner":"loresoft","description":"MongoDB abstract repository pattern","archived":false,"fork":false,"pushed_at":"2025-06-05T07:32:47.000Z","size":246,"stargazers_count":9,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-06-06T20:57:52.359Z","etag":null,"topics":["generic-mongodb-queries","mongodb","repository-pattern"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/loresoft.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":"loresoft"}},"created_at":"2016-04-17T03:57:30.000Z","updated_at":"2025-06-05T07:32:43.000Z","dependencies_parsed_at":"2024-06-06T06:01:35.702Z","dependency_job_id":"39c74de5-2882-440b-83c9-cda253a45454","html_url":"https://github.com/loresoft/MongoDB.Abstracts","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/loresoft/MongoDB.Abstracts","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/loresoft%2FMongoDB.Abstracts","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/loresoft%2FMongoDB.Abstracts/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/loresoft%2FMongoDB.Abstracts/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/loresoft%2FMongoDB.Abstracts/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/loresoft","download_url":"https://codeload.github.com/loresoft/MongoDB.Abstracts/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/loresoft%2FMongoDB.Abstracts/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259638491,"owners_count":22888447,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["generic-mongodb-queries","mongodb","repository-pattern"],"created_at":"2024-12-13T18:17:05.158Z","updated_at":"2025-06-13T11:37:06.274Z","avatar_url":"https://github.com/loresoft.png","language":"C#","funding_links":["https://github.com/sponsors/loresoft"],"categories":[],"sub_categories":[],"readme":"# MongoDB.Abstracts\n\n## Overview\n\nThe MongoDB Abstracts library defines abstract base classes for repository pattern.\n\n[![Build status](https://github.com/loresoft/MongoDB.Abstracts/workflows/Build/badge.svg)](https://github.com/loresoft/MongoDB.Abstracts/actions)\n\n[![NuGet Version](https://img.shields.io/nuget/v/MongoDB.Abstracts.svg?style=flat-square)](https://www.nuget.org/packages/MongoDB.Abstracts/)   \n\n[![Coverage Status](https://coveralls.io/repos/github/loresoft/MongoDB.Abstracts/badge.svg?branch=master)](https://coveralls.io/github/loresoft/MongoDB.Abstracts?branch=master)\n\n## Download\n\nThe MongoDB.Abstracts library is available on nuget.org via package name `MongoDB.Abstracts`.\n\nTo install MongoDB.Abstracts, run the following command in the Package Manager Console\n\n    PM\u003e Install-Package MongoDB.Abstracts\n    \nMore information about NuGet package available at\n\u003chttps://nuget.org/packages/MongoDB.Abstracts\u003e\n\n\n### Features\n\n* interface for generic MongoDB queries; `IMongoQuery\u003cTEntity, TKey\u003e`\n* interface for generic MongoDB repository; `IMongoRepository\u003cTEntity, TKey\u003e`\n* base class for generic MongoDB queries; `MongoQuery\u003cTEntity, TKey\u003e`\n* base class for generic MongoDB repository; `MongoRepository\u003cTEntity, TKey\u003e`\n* interface for generic MongoDB entity; `IMongoEntity`\n* base class for generic MongoDB entity; `MongoEntity`\n* interface for generic MongoDB entity repository; `IMongoEntityRepository\u003cTEntity\u003e`\n* base class for generic MongoDB entity repository; `MongoEntityRepostiory\u003cTEntity\u003e`\n\n### Configuration\n\nRegister with dependency injection\n\n```c#\nservices.AddMongoRepository(\"mongodb://localhost:27017/UnitTesting\");\n```\n\nRegister using a connection name from the appsettings.json\n\n```c#\nservices.AddMongoRepository(\"UnitTesting\");\n```\n\n```json\n{\n  \"ConnectionStrings\": {\n    \"UnitTesting\": \"mongodb://localhost:27017/UnitTesting\"\n  }\n}\n```\n\n#### Discriminators\n\nRegister with discriminator type for support for multiple connections.  This is a similar concept to dependency injection with keyed services.\n\n\nSimple types used to discriminate connections\n\n```c#\npublic readonly struct ProductsConnection;\npublic readonly struct InventoryConnection;\n```\n\nRegister the MongoDB connections using the discriminators\n\n```c#\nservices.AddMongoRepository\u003cProductsConnection\u003e(\"ProductsConnection\");\nservices.AddMongoRepository\u003cInventoryConnection\u003e(\"InventoryConnection\");\n```\n\nConnection string in appsettings.json\n\n```json\n{\n  \"ConnectionStrings\": {\n    \"ProductsConnection\": \"mongodb://localhost:27017/Products\",\n    \"InventoryConnection\": \"mongodb://localhost:27017/Inventory\"\n  }\n}\n```\n\nInject into constructor\n\n```c#\npublic class ProductService\n{\n    private readonly IMongoEntityRepository\u003cProductsConnection, Product\u003e _repository;\n\n    public ProductService(IMongoEntityRepository\u003cProductsConnection, Product\u003e repository)\n    {\n        _repository = repository;\n    }\n}\n\npublic class InventoryService\n{\n    private readonly IMongoEntityRepository\u003cInventoryConnection, Inventory\u003e _repository;\n\n    public InventoryService(IMongoEntityRepository\u003cInventoryConnection, Inventory\u003e repository)\n    {\n        _repository = repository;\n    }\n}\n```\n\n### Usage\n\nFind an entity by key\n\n```c#\n// dependency inject\nvar roleRepo = Services.GetRequiredService\u003cIMongoEntityRepository\u003cRole\u003e\u003e();\n\n// find by key\nvar role = await roleRepo.FindAsync(\"67a0dc52fa5ebe49f293a374\");\n```\n\nFind one entity with query\n\n```c#\n// dependency inject\nvar roleRepo = Services.GetRequiredService\u003cIMongoEntityRepository\u003cRole\u003e\u003e();\n\n// find one by query expression\nvar role = await roleRepo.FindOneAsync(r =\u003e r.Name.StartsWith(\"Admin\"))\n```\n\nFind many with query\n\n```c#\n// dependency inject\nvar roleRepo = Services.GetRequiredService\u003cIMongoEntityRepository\u003cRole\u003e\u003e();\n\n// find one by query expression\nvar roles = await roleRepo.FindAllAsync(r =\u003e r.Name.StartsWith(\"Admin\"))\n```\n\nUse `IQueryable`\n\n```c#\n// dependency inject\nvar roleRepo = Services.GetRequiredService\u003cIMongoEntityRepository\u003cRole\u003e\u003e();\n\n// Use IQueryable\nvar roles = roleRepo.All()\n    .Where(r =\u003e r.IsActive)\n    .ToList();\n```\n\nInsert entity\n\n```c#\n// dependency inject\nvar roleRepo = Services.GetRequiredService\u003cIMongoEntityRepository\u003cRole\u003e\u003e();\n\nvar role = new Role { Name = \"CreateReadRole\" };\n\nvar createdRole = await roleRepo.InsertAsync(role);\n```\n\nUpdate entity\n\n```c#\n// dependency inject\nvar roleRepo = Services.GetRequiredService\u003cIMongoEntityRepository\u003cRole\u003e\u003e();\n\n// find by key\nvar role = await roleRepo.FindAsync(\"67a0dc52fa5ebe49f293a374\");\n\n// make changes\nrole.Name = \"UpdateRole\";\n\nvar updateRole = await roleRepo.UpdateAsync(role);\n```\n\nDelete entity by key\n\n```c#\n// dependency inject\nvar roleRepo = Services.GetRequiredService\u003cIMongoEntityRepository\u003cRole\u003e\u003e();\n\n// items deleted\nvar count = await roleRepo.DeleteAsync(\"67a0dc52fa5ebe49f293a374\");\n```\n\n### Overrides\n\nCreate a custom repository\n\n```c#\npublic class UserRepository : MongoEntityRepository\u003cModels.User\u003e\n{\n    public UserRepository(IMongoDatabase mongoDatabase) : base(mongoDatabase)\n    {\n    }\n\n    protected override void BeforeInsert(Models.User entity)\n    {\n        base.BeforeInsert(entity);\n\n        entity.EmailLower = entity.Email?.ToLowerInvariant();\n    }\n\n    protected override void BeforeUpdate(Models.User entity)\n    {\n        base.BeforeUpdate(entity);\n\n        entity.EmailLower = entity.Email?.ToLowerInvariant();\n    }\n\n    protected override void EnsureIndexes(IMongoCollection\u003cModels.User\u003e mongoCollection)\n    {\n        base.EnsureIndexes(mongoCollection);\n\n        mongoCollection.Indexes.CreateOne(\n            new CreateIndexModel\u003cModels.User\u003e(\n                Builders\u003cModels.User\u003e.IndexKeys.Ascending(s =\u003e s.EmailLower),\n                new CreateIndexOptions { Unique = true }\n            )\n        );\n    }\n\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Floresoft%2Fmongodb.abstracts","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Floresoft%2Fmongodb.abstracts","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Floresoft%2Fmongodb.abstracts/lists"}