MongoDB Agregasyon (Aggregation) Kullanımı
- 467
- (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ü ilepurchases
isimli dizinin eleman sayısıtotalPurchasings
ismi ile alınıyor.multiply
isimli çarpma işlemi operatörü ileprice
alanı vepurchases
içerisindekiquantity
alanlarının toplamı çarpılırpurchasedPrice
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.
MongoDB veritabanındaki dökümanlar içerisinde bulunan dizilerin her bir elemanını ayrı ayrı veri halinde çekebilirsiniz.