MongoDB ile Upsert İşlemleri (C#)

  • 77
  • (1)
  • (5)
  • 25 Nis 2019

Eğer veritabanındaki bir verinin mevcut olup olmama durumuna göre insert (ekleme) veya update (güncelleme) işlemi yapmak istiyorsanız MongoDB kütüphanesindeki upsert işlemi son derece işinize yarayacaktır.

Product isimli veri modeli şu şekilde tanımlı olsun.


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; }
}

Sadece Bir Veriyi Girme

Aşağıdaki kodu çalıştırdığınızda veritabanına ekleme yapılacaktır.


MongoClient client = new MongoClient("mongodb://localhost:27017");
IClientSessionHandle session = client.StartSession();
IMongoDatabase db = client.GetDatabase("mydb");

Product product = new Product()
{
    Name = "Cam Bardak", Price = 4.00, TradeMark = "XYZ Cam"
};
var collProducts = db.GetCollection<Product>("products");
// Name değeri mevcut ise update değilse insert işlemi uygulanır
collProducts.UpdateOne(Builders<Product>.Filter.Eq(_ => _.Name, product.Name),
    Builders<Product>.Update.SetOnInsert(_ => _.Name, product.Name).
        Set(_ => _.TradeMark, product.TradeMark).
        Set(_ => _.Price, product.Price).
        Set(_ => _.Purchases, new List<Purchase>()),
    new UpdateOptions() { IsUpsert = true });

Ekleme yapılan veri aşağıdaki gibi koleksiyonda yerini alır.

İkinci ürün aşağıdaki şekilde eklendiğinde farklı bir isimle yeni bir döküman oluşturacaktır.


Product product = new Product()
{
    Name = "Füme Bardak", Price = 5.00, TradeMark = "XYZ Cam"
};
var collProducts = db.GetCollection<Product>("products");
collProducts.UpdateOne(Builders<Product>.Filter.Eq(_ => _.Name, product.Name),
    Builders<Product>.Update.SetOnInsert(_ => _.Name, product.Name).
        Set(_ => _.TradeMark, product.TradeMark).
        Set(_ => _.Price, product.Price).
        Set(_ => _.Purchases, new List<Purchase>()),
    new UpdateOptions() { IsUpsert = true });

Cam Bardak isimli bir Product veriyi tekrar eklemeye çalıştığınızda ise var olanı güncelleyecektir.


Product product = new Product()
{
    Name = "Cam Bardak", Price = 2.15, TradeMark = "XYZ Cam"
};
var collProducts = db.GetCollection<Product>("products");
collProducts.UpdateOne(Builders<Product>.Filter.Eq(_ => _.Name, product.Name),
    Builders<Product>.Update.SetOnInsert(_ => _.Name, product.Name).
        Set(_ => _.TradeMark, product.TradeMark).
        Set(_ => _.Price, product.Price).
        Set(_ => _.Purchases, new List<Purchase>()),
    new UpdateOptions() { IsUpsert = true });

SetOnInsert kullanılan alanlar sadece ilk ekleme yapıldığında oluşturulur. IsUpsert özelliğinin etkinleştirilmesi ile filtreye göre belirlenmiş alan değeri mevcutsa güncelleme, mevcut değilse ekleme yapılır.

Eğer asenkronize işlem yapılmasını istiyorsanız async metotlar içerisinde aşağıdaki şekilde de veri girişi yapabilirsiniz.


var collProducts = db.GetCollection<Product>("products");
await collProducts.UpdateOneAsync(Builders<Product>.Filter.Eq(_ => _.Name, product.Name),
    Builders<Product>.Update.SetOnInsert(_ => _.Name, product.Name).
        Set(_ => _.TradeMark, product.TradeMark).
        Set(_ => _.Price, product.Price).
        Set(_ => _.Purchases, new List<Purchase>()),
    new UpdateOptions() { IsUpsert = true });

Birden Fazla Veriyi Girme

İlişkili İçerikler

MongoDB ilişkisel olmayan veritabanına C# üzerinden veri girişi yapmak için bu içeriği inceleyebilir ve uygulayabilirsiniz.

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

Paylaşın
Etiket Bulutu