DEV Community

VzlDev
VzlDev

Posted on

1

Create a Web API with MongoDB

Hello guys!
Today I challenged myself to learn a little bit about MongoDB, so I created an API that will connect to a MongoDB database.

What is MongoDB?

MongoDB is a NOSQL database and NOSQL means "Not Only SQL". This is because MongoDB is not only a relational database. NOSQL can store unstructured data.

MongoDB is a document database. It stores data in a type of JSON format called BSON. A record in MongoDB is a document, which is a data structure composed of key value pairs similar to the structure of JSON objects.
And this documents are stored in collections (you can compare a collection like as a table in SQL Relational databases). And all this collections are stored in a database!

MongoDB Setup

To start using MongoDB the first thing that you need is the MongoDB "engine". For that I recommend using a image container and run that image in the docker container.

After pull the image and run it, you need a way to interact with the database. I used MongoDB Compass.

MongoDB integration

To integrate your MongoDB database with your .NET API, you'll need to install the following nuget package:

  • MongoDB.Driver Image description

I have in the Model folder a Event class that represent the document in MongoDB.
Important thing to notice here is there is specific Data Annotations to handle MongoDB data.

public class Event
{
    [BsonId]
    public Guid EventId { get; set; }

    [BsonElement("title")]
    public string Title { get; set; }

    [BsonElement("description")]
    public string Description { get; set; }

    [BsonElement("location")]
    public string Location { get; set; }

    [BsonElement("date")]
    public DateTime Date { get; set; }

    [BsonElement("users")]
    public List<Guid> Users { get; set; } // List of users associated with the event
}
Enter fullscreen mode Exit fullscreen mode

The next thing you need is to establish connection to the MongoDB. In this example I create a factory class to do that.

public class MongoDbConnection : IMongoDbConnection
{
    private readonly IConfiguration _configuration;

    public MongoDbConnection(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    public IMongoDatabase GetDatabase()
    {
        var connectionString = _configuration.GetSection("MyDb").GetValue<string>("ConnectionString");
        var databaseName = _configuration.GetSection("MyDb").GetValue<string>("DatabaseName");

        var url = MongoUrl.Create(connectionString);
        var client = new MongoClient(url);
        var database = client.GetDatabase(databaseName);

        return database;
    }
}
Enter fullscreen mode Exit fullscreen mode

And on the appsettings.json file, I added the connection string:

"MyDb": {
  "ConnectionString": "mongodb://localhost:27017",
  "DatabaseName": "Eventsdb",
  "EventsCollectionName": "events"
}
Enter fullscreen mode Exit fullscreen mode

I created a repository class to interact with the database:

public class EventsRepository : IEventsRepository
{
    private readonly IMongoDbConnection _connection;
    private readonly IMongoCollection<Event> _collection;

    public EventsRepository(IMongoDbConnection connection)
    {
        _connection = connection;

        var database = _connection.GetDatabase();
        _collection = database.GetCollection<Event>("events");
    }

    public async Task<bool> CreateEvent(Event evento)
    {
        try
        {
            await _collection.InsertOneAsync(evento);
            return true;
        }
        catch (Exception)
        {
            throw;
        }
    }

    public async Task<bool> DeleteEvent(Guid id)
    {
        var filterDefinition = Builders<Event>.Filter.Eq(a => a.EventId, id);
        var result = await _collection.DeleteOneAsync(filterDefinition);
        return result.DeletedCount > 0;
    }

    public async Task<List<Event>> GetAllEvents()
    {
        return await _collection.Find(Builders<Event>.Filter.Empty).ToListAsync();
    }

    public async Task<Event> GetEventById(Guid id)
    {
        var filterDefinition = Builders<Event>.Filter.Eq(a => a.EventId, id);
        return await _collection.Find(filterDefinition).FirstAsync();
    }

    public async Task<bool> UpdateEvent(Event evento)
    {
        var filterDefinition = Builders<Event>.Filter.Eq(a => a.EventId, evento.EventId);
        var result = await _collection.ReplaceOneAsync(filterDefinition, evento);
        return result.ModifiedCount > 0;
    }
}
Enter fullscreen mode Exit fullscreen mode

And that's it guys, a simple use case of using a api with mongodb. I hope you liked it, stay tuned for more!

Image of Docusign

πŸ› οΈ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more

Top comments (1)

Collapse
 
chunjieyaya_70 profile image
吴ε’ͺε’ͺ β€’

δΈι”™οΌŒιžεΈΈε₯½

πŸ‘‹ Kindness is contagious

Dive into an ocean of knowledge with this thought-provoking post, revered deeply within the supportive DEV Community. Developers of all levels are welcome to join and enhance our collective intelligence.

Saying a simple "thank you" can brighten someone's day. Share your gratitude in the comments below!

On DEV, sharing ideas eases our path and fortifies our community connections. Found this helpful? Sending a quick thanks to the author can be profoundly valued.

Okay