MongoDB - Toplama

Toplama işlemleri, veri kayıtlarını işler ve hesaplanmış sonuçları döndürür. Toplama işlemleri, birden çok belgeden değerleri bir arada gruplandırır ve tek bir sonuç döndürmek için gruplanmış veriler üzerinde çeşitli işlemler gerçekleştirebilir. SQL count (*) ve with group by, MongoDB toplamaya eşdeğerdir.

Aggregate () Yöntemi

MongoDB'de toplama için kullanmalısınız aggregate() yöntem.

Sözdizimi

Temel sözdizimi aggregate() yöntem aşağıdaki gibidir -

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

Misal

Koleksiyonda aşağıdaki verilere sahipsiniz -

{
   _id: ObjectId(7df78ad8902c)
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by_user: 'tutorials point',
   url: 'http://www.tutorialspoint.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
},
{
   _id: ObjectId(7df78ad8902d)
   title: 'NoSQL Overview', 
   description: 'No sql database is very fast',
   by_user: 'tutorials point',
   url: 'http://www.tutorialspoint.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 10
},
{
   _id: ObjectId(7df78ad8902e)
   title: 'Neo4j Overview', 
   description: 'Neo4j is no sql database',
   by_user: 'Neo4j',
   url: 'http://www.neo4j.com',
   tags: ['neo4j', 'database', 'NoSQL'],
   likes: 750
},

Şimdi yukarıdaki koleksiyondan, her kullanıcı tarafından kaç öğretici yazıldığını belirten bir liste görüntülemek istiyorsanız, o zaman aşağıdakileri kullanacaksınız. aggregate() yöntem -

> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{ "_id" : "tutorials point", "num_tutorial" : 2 }
{ "_id" : "Neo4j", "num_tutorial" : 1 }
>

Yukarıdaki kullanım durumu için Sql eşdeğer sorgusu olacaktır select by_user, count(*) from mycol group by by_user.

Yukarıdaki örnekte, belgeleri alana göre grupladık by_userve kullanıcı tarafından her görüldüğünde, önceki toplam değeri artırılır. Aşağıda, mevcut toplama ifadelerinin bir listesi verilmiştir.

İfade Açıklama Misal
$ toplam Koleksiyondaki tüm belgelerden tanımlanan değeri özetler. db.mycol.aggregate ([{$ grup: {_id: "$ by_user", num_tutorial: {$ sum: "$ beğeniler"}}}])
$ avg Koleksiyondaki tüm belgelerden verilen tüm değerlerin ortalamasını hesaplar. db.mycol.aggregate ([{$ grup: {_id: "$ by_user", num_tutorial: {$ avg: "$ beğeniler"}}}])
$ dk Koleksiyondaki tüm belgelerden minimum karşılık gelen değerleri alır. db.mycol.aggregate ([{$ group: {_id: "$ by_user", num_tutorial: {$ min: "$ likes"}}}])
$ max Koleksiyondaki tüm belgelerden maksimum karşılık gelen değerleri alır. db.mycol.aggregate ([{$ grup: {_id: "$ by_user", num_tutorial: {$ max: "$ beğeniler"}}}])
$ itme Değeri, elde edilen belgede bir diziye ekler. db.mycol.aggregate ([{$ grup: {_id: "$ by_user", url: {$ push: "$ url"}}}])
$ addToSet Değeri elde edilen belgedeki bir diziye ekler, ancak yinelemeler oluşturmaz. db.mycol.aggregate ([{$ grup: {_id: "$ by_user", url: {$ addToSet: "$ url"}}}])
$ ilk Gruplandırmaya göre kaynak belgelerden ilk belgeyi alır. Tipik olarak bu, yalnızca önceden uygulanan bazı "$ sort" -stage ile birlikte mantıklıdır. db.mycol.aggregate ([{$ group: {_id: "$ by_user", first_url: {$ first: "$ url"}}}])
$ son Gruplandırmaya göre kaynak belgelerden son belgeyi alır. Tipik olarak bu, yalnızca önceden uygulanan bazı "$ sort" -stage ile birlikte mantıklıdır. db.mycol.aggregate ([{$ group: {_id: "$ by_user", last_url: {$ last: "$ url"}}}])

Boru Hattı Konsepti

UNIX komutunda, kabuk boru hattı, bazı girdiler üzerinde bir işlem yürütme ve çıktıyı bir sonraki komut için girdi olarak kullanma olasılığı anlamına gelir. MongoDB ayrıca toplama çerçevesinde aynı kavramı destekler. Bir dizi olası aşama vardır ve bunların her biri girdi olarak bir dizi belge olarak alınır ve sonuçta ortaya çıkan bir dizi belge (veya boru hattının sonunda ortaya çıkan nihai JSON belgesi) üretir. Bu daha sonra bir sonraki aşama için kullanılabilir ve böyle devam eder.

Aşağıda, toplama çerçevesindeki olası aşamalar verilmiştir -

  • $project - Bir koleksiyondan bazı belirli alanları seçmek için kullanılır.

  • $match - Bu bir filtreleme işlemidir ve dolayısıyla bir sonraki aşamaya girdi olarak verilen belge miktarını azaltabilir.

  • $group - Bu, yukarıda tartışıldığı gibi gerçek toplamayı yapar.

  • $sort - Belgeleri sıralar.

  • $skip - Bununla, belirli sayıda belge için belge listesinde ileri atlamak mümkündür.

  • $limit - Bu, bakılacak belge miktarını, mevcut konumlardan başlayarak verilen numara ile sınırlar.

  • $unwind- Bu, dizileri kullanan belgeyi çözmek için kullanılır. Bir dizi kullanılırken, veriler önceden birleştirilir ve bu işlem, tekrar ayrı belgelere sahip olmak için bu işlem geri alınacaktır. Böylece bu aşamada bir sonraki aşama için belge miktarını artıracağız.