MongoDB Agregasyon (Aggregation) Kullanımı

  • 433
  • (1)
  • (5)
  • 22 Nis 2019

Dökümanları veya içlerindeki alt dökümanları gruplayıp filtreleyebileceğiniz çeşitli agregasyon metotları bulunmaktadır. MongoDB Compass üzerinde bu aggregation işlemlerini deneyebileceğiniz özel bir bölüm de bulunuyor.

Burada hazırladığınız aggregationları Export To Language seçeneği ile Java, Node.js (Javascript), C# veya Python dillerine dönüştürebilirsiniz. Bu dillerde geliştirdiğiniz projelerinizden bağlandığınız veritabanınız için bu agregasyonları kullanabilirsiniz.

İlk stage bölümünden $project seçeneği ile gelen dökümanları yeniden yapılandırarak veri alma işlemi yapılabilir.


{
    productName: "$name",
    tradeMark: "$tradeMark",
    unitPrice: "$price",
    totalPurchasings: { $size: "$purchases" },
    purchasedPrice: {
      $multiply: [ "$price", { $sum: "$purchases.quantity" } ]
    }
}

Bu aggregation içerisinde:

  • name alanı productName ismi ile alınıyor.
  • tradeMark alanı aynı isimle alınıyor.
  • price alanı unitPrice ismi ile alınıyor.
  • size operatörü ile purchases isimli dizinin eleman sayısı totalPurchasings ismi ile alınıyor.
  • multiply isimli çarpma işlemi operatörü ile price alanı ve purchases içerisindeki quantity alanlarının toplamı çarpılır purchasedPrice ismi ile alınıyor.

Export To Language seçeneği ile C# kodu olarak veya başka bir dilde çıktı alıp projenizde kullanabilirsiniz.

Alınmış kod aşağıdaki gibi olacaktır.


new BsonArray
{
    new BsonDocument("$project", 
    new BsonDocument
        {
            { "productName", "$name" }, 
            { "tradeMark", "$tradeMark" }, 
            { "unitPrice", "$price" }, 
            { "totalPurchasings", 
    new BsonDocument("$size", "$purchases") }, 
            { "purchasedPrice", 
    new BsonDocument("$multiply", 
    new BsonArray
                {
                    "$price",
                    new BsonDocument("$sum", "$purchases.quantity")
                }) }
        })
}

Bu kodu aggregation isimli bir değişkene atayıp agregasyon için kullanabilirsiniz. Koleksiyon içerisindeki veri modeli ile dönmesi gereken veri modeli aynı olmadığı için ayrı bir veri modeli tanımlamalısınız.


//Koleksiyon içerisinde veri modeli
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; }
}

//Alt veri modeli
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; }
}

//Agregasyon için veri modeli
public class AggregatedProduct
{
    [BsonId]
    public ObjectId Id { get; set; }
    [BsonElement("productName")]
    public string Name { get; set; }
    [BsonElement("tradeMark")]
    public string TradeMark { get; set; }
    [BsonElement("unitPrice")]
    public double Price { get; set; }
    [BsonElement("totalPurchasings")]
    public int TotalPurchaseCount { get; set; }
    [BsonElement("purchasedPrice")]
    public double TotalPurchasePrice { get; set; }
}

Agregasyon çıktısı BsonArray türünde bir değişken olacaktır.


var aggregation = new BsonArray
    {
        new BsonDocument("$project",
        new BsonDocument
            {
                { "productName", "$name" },
                { "tradeMark", "$tradeMark" },
                { "unitPrice", "$price" },
                { "totalPurchasings",
        new BsonDocument("$size", "$purchases") },
                { "purchasedPrice",
        new BsonDocument("$multiply",
        new BsonArray
                    {
                        "$price",
                        new BsonDocument("$sum", "$purchases.quantity")
                    }) }
            })
    };

var pipeline = PipelineDefinition<Product, AggregatedProduct>
    .Create(aggregation.ToList().Cast<BsonDocument>());
var aggProducts = await collProducts.Aggregate(pipeline).ToListAsync();

Her aggregation içerisinde birden fazla stage kullanılabilmektedir. Bu stagelerin tamamı pipeline nesnesine atandıktan sonra agregasyon çalıştırılır. Sonuçlar AggregatedProduct listesine atanır.

İlişkili İçerikler

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

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