MongoDB Veritabanına Veri Girme ve Okuma (C#)

  • 791
  • (2)
  • (5)
  • 21 Nis 2019

C# üzerinden MongoDB veritabanı işlemleri oldukça kolay ve zevklidir. NuGet Packages üzerinden MongoDB bağlantısı için gereken kütüphaneleri projenize eklemeniz gerekiyor.

Kod alanınıza using MongoDB.Driver; ile gereken kütüphaneyi ekledikten sonra aşağıdaki kod parçacığı ile veritabanına bağlanma işlemi gerçekleştirilir.


string connString = "mongodb://localhost:27017";
// Bağlantı metni local hizmetler için aynıdır
MongoClient client = new MongoClient(connString);
IClientSessionHandle session = client.StartSession();
IMongoDatabase db = client.GetDatabase("mydb");

Eğer sisteminizde kurulu olan MongoDB üzerinde mydb isimli bir veritabanı yoksa otomatik oluşturulacaktır. MongoDB' nin güzel yönlerinden birisi de veritabanı veya döküman mevcut değilse onunla ilgili bir işlem yapıldığı zaman sıfırdan oluşturulur.

Elbette tavsiye edilen yöntem bu kodların asenkronize (async) olarak kullanılmasıdır.


string connString = "mongodb://localhost:27017";
// Bağlantı metni local hizmetler için aynıdır
MongoClient client = new MongoClient(connString);
IClientSessionHandle session = await client.StartSessionAsync();
IMongoDatabase db = client.GetDatabase("mydb");

Veritabanına girmek üzere bir veri modeli oluşturulabilir. Bu veri modelinin içerisinde de başka bir veri modeli listesi olsun. Böylece MongoDB içerisindeki döküman mantığının MS-SQL, MySQL, Oracle gibi ilişkisel tablo mantığından ne kadar farklı olduğunu gözlemleyebilirsiniz.

using MongoDB.Bson; kodu ile bir kütüphane daha ekleyebilirsiniz. Çünkü oluşturulacak veri modellerinde id değerleri ObjectId türünde olacaktır.


public class Product
{
    [BsonId]
    public ObjectId Id { get; set; }
    [BsonElement("name")]
    public string Name { get; set; }
    [BsonElement("tradeMark")]
    public string TradeMark { get; set; }
    [BsonElement("price")]
    public double Price { get; set; }
    [BsonElement("purchases")]
    public List<Purchase> Purchases { get; set; }
    [BsonIgnore]
    public int TotalPurchaseCount { get; set; }
    [BsonIgnore]
    public double TotalPurchasePrice { get; set; }
}
public class Purchase
{
    [BsonId]
    public ObjectId Id { get; set; }
    [BsonElement("date")]
    [BsonDateTimeOptions(Kind = DateTimeKind.Local)]
    public DateTime Date { get; set; }
    [BsonElement("quantity")]
    public double Quantity { get; set; }
}

Veri Girişi

Aşağıdaki kod ile veritabanında products isimli koleksiyona iki adet döküman girilecektir.


var collProducts = db.GetCollection<Product>("products");

Product product1 = new Product()
{
    Name = "250 ml Cam Şişe", TradeMark = "Siyah Cam", Price = 1.75
};
product1.Purchases = new List<Purchase>()
{
    new Purchase()
    {
        Id = ObjectId.GenerateNewId(), Date = new DateTime(2018, 3, 6),
        Quantity = 550
    },
    new Purchase()
    {
        Id = ObjectId.GenerateNewId(), Date = new DateTime(2018, 4, 11),
        Quantity = 240
    }
};
await collProducts.InsertOneAsync(product1);
Product product2 = new Product()
{
    Name = "100 ml Pet Şişe", TradeMark = "M Plastik", Price = 0.15
};
product2.Purchases = new List<Purchase>();
await collProducts.InsertOneAsync(product2);

Çalıştırılan kod sonucunda mydb isimli veritabanında products isimli bir collection oluşturulup içerisine iki adet döküman eklenir. BsonElement attributeleri ile isimlendirilmiş alanları bu dökümanların içerisinde göreceksiniz. MongoDB Compass uygulaması ile veritabanı ve koleksiyonlara gözatabilirsiniz.

İlişkisel olmayan (non-related) veritabanı sisteminde içiçe veri modelleri depolamak birçok açıdan kolaylık sağlamaktadır. Ancak her dökümanın büyüklüğü en fazla 16 mb olabilmektedir. Bu kapasite tek bir döküman içerisine istenilen veriyi yerleştirebilmek açısından oldukça yeterli bir alandır. Elbette koleksiyon içerisindeki dökümanların sayısı için sınırlama bilgisayar kapasitesi kadardır.

Veri Okuma

Veri okumak için öncelikle Find yöntemini uygulayabilirsiniz. Ancak çok büyük sorgulamalarda bu yöntem için bir kapasite sınırı mevcuttur. Böylesi durumlar için Aggregation kullanımı daha mantıklı olacaktır.

Bu şekildeki bir koleksiyonun içerisinden veri çekmek için Filter mantığını anlamak gerekiyor. Builder<Product>.Filter nesnesi ile süzgeçler inşa edilebilir.


var filter = Builders<Product>.Filter.Eq(_ => _.Name, "200 ml Pet Şişe");
var products = await collProducts.Find(filter).FirstOrDefaultAsync();

Name özelliğine göre ilk bulunan döküman, C# veri modeline dönüştürülür.


var filter = Builders<Product>.Filter.Eq(_ => _.Name, "200 ml Pet Şişe");
var products = await collProducts.Find(filter).FirstOrDefaultAsync();

Daha farklı süzgeç türlerini inceleyebilirsiniz.


// İçerisinde Şişe geçen sonuçları liste olarak döndürür
var filter = Builders<Product>.Filter.Regex(_ => _.Name, new BsonRegularExpression("Şişe", "i"));
var products = await collProducts.Find(filter).ToListAsync();

// Price değeri 1.00 dan büyük olan sonuçları döndürür
var filter = Builders<Product>.Filter.Gt(_ => _.Price, 1.00);
var products = await collProducts.Find(filter).ToListAsync();

// BsonIgnore ile hariç tutulan değerleri hesaplamak için
products.ForEach(p => {
    if (p.Purchases == null)
    {
        p.TotalPurchaseCount = 0;
        p.TotalPurchasePrice = 0.0;
    }
    else
    {
        p.TotalPurchaseCount = p.Purchases.Count;
        p.TotalPurchasePrice = p.Purchases.Sum(pur => pur.Quantity * p.Price);
    }
});

İlişkili İçerikler

MongoDB koleksiyonundan belli bir şema haline getirilmiş dökümanlar çekmek için aggregation son derece faydalı bir yöntemdir.

Veri mevcut ise güncelleme, mevcut değil ise ekleme işlemine upsert denmektedir. Update ve Insert kelimelerinin birleşiminden üretilmiştir.

MongoDB veritabanındaki dökümanlar içerisinde bulunan dizilerin her bir elemanını ayrı ayrı veri halinde çekebilirsiniz.

Paylaşın
Etiket Bulutu