{"id":25157534,"url":"https://github.com/serkanyazicioglu/mongodbrepository","last_synced_at":"2025-04-30T09:50:24.346Z","repository":{"id":65376076,"uuid":"158516189","full_name":"serkanyazicioglu/MongoDbRepository","owner":"serkanyazicioglu","description":"MongoDb base repository classes for .NET Core.","archived":false,"fork":false,"pushed_at":"2025-02-08T14:45:30.000Z","size":76,"stargazers_count":3,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-25T21:07:10.441Z","etag":null,"topics":["csharp","mongodb","repository"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/serkanyazicioglu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-11-21T08:34:49.000Z","updated_at":"2025-02-08T14:45:34.000Z","dependencies_parsed_at":"2023-01-20T08:17:46.441Z","dependency_job_id":null,"html_url":"https://github.com/serkanyazicioglu/MongoDbRepository","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/serkanyazicioglu%2FMongoDbRepository","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/serkanyazicioglu%2FMongoDbRepository/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/serkanyazicioglu%2FMongoDbRepository/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/serkanyazicioglu%2FMongoDbRepository/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/serkanyazicioglu","download_url":"https://codeload.github.com/serkanyazicioglu/MongoDbRepository/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251679302,"owners_count":21626499,"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":["csharp","mongodb","repository"],"created_at":"2025-02-09T01:23:56.372Z","updated_at":"2025-04-30T09:50:24.298Z","avatar_url":"https://github.com/serkanyazicioglu.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![.NET](https://github.com/serkanyazicioglu/MongoDbRepository/actions/workflows/dotnet-pipeline.yml/badge.svg)](https://github.com/serkanyazicioglu/MongoDbRepository/actions/workflows/dotnet-pipeline.yml)\n[![NuGet](https://img.shields.io/nuget/v/Nhea.Data.Repository.MongoDbRepository.svg)](https://www.nuget.org/packages/Nhea.Data.Repository.MongoDbRepository/)\n\n# Nhea MongoDb Repository\n\nMongoDb base repository classes.\n\n\n## Getting Started\n\nNhea MongoDb Repository is on NuGet. You may install Nhea MongoDb Repository via NuGet Package manager.\n\nhttps://www.nuget.org/packages/Nhea.Data.Repository.MongoDbRepository/\n\n```\nInstall-Package Nhea.Data.Repository.MongoDbRepository\n```\n\n### Prerequisites\n\nProject is built with .NET 9.0.\n\n### Configuration\n\nFirst of all creating a base repository class is a good idea to set basic properties like connection string.\n\n```\npublic abstract class BaseMongoDbRepository\u003cT\u003e : Nhea.Data.Repository.MongoDbRepository.BaseMongoDbRepository\u003cT\u003e where T : MongoDocument, new()\n{\n    public override string ConnectionString =\u003e \"mongodb://localhost:27017/admin\";\n\n    protected override string DefaultDatabaseName =\u003e \"TestDb\";\n}\n```\nYou may remove the abstract modifier if you want to use generic repositories or you may create individual repository classes for each of your objects if you need to set specific properties.\n```\npublic partial class Member : MongoDocument\n{\n    public string Title { get; set; }\n\n    public string UserName { get; set; }\n\n    public string Password { get; set; }\n\n    public int Status { get; set; }\n\n    public string Email { get; set; }\n}\n\npublic class MemberRepository : BaseMongoDbRepository\u003cMember\u003e\n{\n    public override Member CreateNew()\n    {\n        var entity = base.CreateNew();\n        entity.Status = (int)StatusType.Available;\n        return entity;\n    }\n\n    //Override to map to a different database. Set DatabaseName property on the fly if you want to change it.\n    //public override string DefaultDatabaseName =\u003e base.DefaultDatabaseName;\n\n    //Override to change target collection name. By default uses given type name for collection name. Set CollectionName property on the fly if you want to change it\n    //public override string DefaultCollectionName =\u003e base.DefaultCollectionName;\n}\n```\nThen in your code just initalize a new instance of your class and call appropriate methods for your needs.\n\n```\nObjectId newMemberId = ObjectId.GenerateNewId();\n\nusing (MemberRepository memberRepository = new MemberRepository())\n{\n    var member = memberRepository.CreateNew();\n    member._id = newMemberId;\n    member.Title = \"Test Member\";\n    member.UserName = \"username\";\n    member.Password = \"password\";\n    member.Email = \"test@test.com\";\n    memberRepository.Save();\n}\n\nusing (MemberRepository memberRepository = new MemberRepository())\n{\n    var members = memberRepository.GetAll(query =\u003e query._id \u003e= new ObjectId(DateTime.Today, 0, 0, 0)).ToList();\n\n    foreach (var member in members)\n    {\n        member.Title += \" Lastname\";\n    }\n\n    memberRepository.Save();\n}\n\nusing (MemberRepository memberRepository = new MemberRepository())\n{\n    var member = memberRepository.GetById(newMemberId);\n\n    if (member != null)\n    {\n        member.Title = \"Selected Member\";\n        memberRepository.Save();\n    }\n}\n\nusing (MemberRepository memberRepository = new MemberRepository())\n{\n    var member = memberRepository.GetSingle(query =\u003e query.Title == \"Selected Member\");\n\n    if (member != null)\n    {\n        member.Title = \"Selected Member 2\";\n        memberRepository.Save();\n    }\n}\n\nusing (MemberRepository memberRepository = new MemberRepository())\n{\n    memberRepository.Delete(query =\u003e query.Title == \"Selected Member 2\");\n    memberRepository.Save();\n}\n\nusing (MemberRepository memberRepository = new MemberRepository())\n{\n    var member = memberRepository.CreateNew();\n    bool isNew = memberRepository.IsNew(member);\n}\n\nusing (MemberRepository memberRepository = new MemberRepository())\n{\n    memberRepository.GetAll();\n\n    memberRepository.DatabaseName = \"AnotherDbName\";\n    memberRepository.CollectionName = \"AnotherCollectionName\";\n\n    memberRepository.Save();\n}\n```\n### Async List\n\nYou can use all methods with usual async sytnax but Mongo has it's own collection type for async collection fetching. You can use ToMongoListAsync extension method instead.\n```\nusing (MemberRepository memberRepository = new MemberRepository())\n{\n    var members = await memberRepository.GetAll(query =\u003e query._id \u003e= new ObjectId(DateTime.Today, 0, 0, 0)).ToMongoListAsync();\n}\n```\n### ReadOnly Mode\n\nYou can set readonly mode for repositories. This may increase the performance when you don't need the data to be updated. Simply set a constructor on your repository to pass the isReadOnly parameter to base repo.\n```\npublic MemberRepository(bool isReadOnly = false)\n    : base(isReadOnly)\n{\n}\n```\n```\n//Switch to readonly\nusing (MemberRepository memberRepository = new MemberRepository(isReadOnly: true))\n{\n    var member = await memberRepository.GetByIdAsync(newMemberId);\n    member.Title = \"You shall not change\";\n    await memberRepository.SaveAsync();\n}\n```\n\n\n### Dynamic attributes\n\nRepositories rely on strict document types because of object mapping. You may add custom Bson objects by specifing BsonDocument properties.\n```\n[BsonExtraElements]\npublic BsonDocument AttributeValue { get; set; }\n```\n```\nmember.AttributeValue.Add(\"CustomJsonData\", jsonData.ToString());\n```\n\n### Subscription\nIn order to use this feature your MongoDb server must have replication enabled. MongoDb servers send messages between these servers to duplicate datas so we actually use this channels for listening document changes.\n\nFirst you have to get an instance of subscribing repository. This is a static instance so you will get the same object everytime you call this method. Later bind an event to 'SubscriptionTriggered'.\n```\nvar subscribingRepository = MemberRepository.GetSubscribingRepository();\nsubscribingRepository.SubscriptionTriggered += SubscribingRepository_SubscriptionTriggered;\n```\nThen all you have to do is just listening to this callback.\n```\nprivate static void SubscribingRepository_SubscriptionTriggered(object sender, Member entity)\n{\n    Console.WriteLine(\"Subscription triggered: \" + entity.Title);\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fserkanyazicioglu%2Fmongodbrepository","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fserkanyazicioglu%2Fmongodbrepository","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fserkanyazicioglu%2Fmongodbrepository/lists"}