﻿
{"id":9097,"date":"2018-08-15T14:27:59","date_gmt":"2018-08-15T14:27:59","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=9097"},"modified":"2018-08-15T14:27:59","modified_gmt":"2018-08-15T14:27:59","slug":"nosql-mongodb-islevsel-fonksiyonlar-ve-aggregate-operatorleri","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/nosql-mongodb-islevsel-fonksiyonlar-ve-aggregate-operatorleri\/","title":{"rendered":"NoSQL &#8211; MongoDB \u0130\u015flevsel Fonksiyonlar ve Aggregate Operat\u00f6rleri"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Klasik olarak veritaban\u0131ndan elde edilen veriler \u00fczerinde belli ba\u015fl\u0131 i\u015flemleri NoSQL sistemlerinde de uygulayabilmekteyiz. Bu i\u00e7eri\u011fimizde MongoDB veritaban\u0131nda bar\u0131nd\u0131r\u0131lan veriler \u00fczerinde s\u0131ralama, limit belirleme vs. gibi s\u0131radan i\u015flevlerle beraber $group, $lookup vs. gibi aggregate operat\u00f6rleri ile elde edilen verilerin daha farkl\u0131 modifiyeler sa\u011flanarak nas\u0131l anlamland\u0131r\u0131labilece\u011fini inceliyor olaca\u011f\u0131z.<\/p>\n<p>\u0130\u00e7eri\u011fimizde \u00f6rneklendirme a\u015famas\u0131nda model olarak;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nconst mongoose = require(&quot;mongoose&quot;);\r\n \r\nmodule.exports = mongoose.model(&quot;Employees&quot;, new mongoose.Schem a({\r\n    _id: Number,\r\n    userName: String,\r\n    name: String,\r\n    surName: String,\r\n    age: Number\r\n}));\r\n<\/pre>\n<p>router yap\u0131s\u0131 olarak;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nconst express = require(&quot;express&quot;);\r\nconst router = express.Router();\r\nrouter.get(&quot;\/&quot;, (request, response, next) =&gt; {\r\n    response.send(&quot;Merhaba d\u00fcnya...&quot;);\r\n});\r\nmodule.exports = router;\r\n<\/pre>\n<p>ve ana mod\u00fcl olarak;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nconst express = require(&quot;express&quot;);\r\nconst app = express();\r\nconst mongoose = require(&quot;mongoose&quot;);\r\nmongoose.connect(&quot;mongodb:\/\/localhost\/companydb&quot;)\r\n    .then(() =&gt; console.log(&quot;Veritaban\u0131 ba\u011flant\u0131s\u0131 ba\u015far\u0131yla sa\u011flanm\u0131\u015ft\u0131r...&quot;))\r\n    .catch(error =&gt; console.log(&quot;Veritaban\u0131na ba\u011flant\u0131 olu\u015fturulurken beklenmeyen bir hatayla kar\u015f\u0131la\u015f\u0131ld\u0131...&quot;, error.message));\r\nconst employeeRouter = require(&quot;.\/routers\/employeeRouter&quot;);\r\napp.use(&quot;\/employee&quot;, employeeRouter);\r\napp.listen(5000);\r\n<\/pre>\n<p>yap\u0131lar\u0131n\u0131 kullanacak ve bunlardan route yap\u0131s\u0131nda \u00e7al\u0131\u015faca\u011f\u0131m\u0131z\u0131 ba\u015ftan bildirmekte fayda g\u00f6r\u00fcyorum.<\/p>\n<h3>S\u0131ralama(sort)<\/h3>\n<p>Belirtilen kolona g\u00f6re verileri s\u0131ralamaktad\u0131r. Klasik SQL&#8217;de ki &#8220;Order By&#8221; komutana kar\u015f\u0131l\u0131k gelmektedir. Say\u0131sal tipte kolonlarda b\u00fcy\u00fckl\u00fck-k\u00fc\u00e7\u00fckl\u00fck k\u0131yaslamas\u0131 yaparken metinsel kolonlarda alfabetik s\u0131ralama ger\u00e7ekle\u015ftirmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nconst express = require(&quot;express&quot;);\r\nconst router = express.Router();\r\nconst employeeModel = require(&quot;..\/models\/employee&quot;);\r\nrouter.get(&quot;\/&quot;, (request, response, next) =&gt; {\r\n    employeeModel.find({}, (error, data) =&gt; {\r\n        if (!error)\r\n            response.json(data);\r\n        else\r\n            response.send(&quot;Beklenmeyen bir hata ile kar\u015f\u0131la\u015f\u0131ld\u0131.&quot;, error.message);\r\n    }).sort({ &quot;_id&quot;: -1 });\r\n});\r\nmodule.exports = router;\r\n<\/pre>\n<p>Dikkat ederseniz e\u011fer belirtilen &#8220;_id&#8221; kolonuna &#8220;-1&#8221; de\u011feri veirlmi\u015ftir. Bu de\u011fer say\u0131sal olarak b\u00fcy\u00fckten k\u00fc\u00e7\u00fc\u011fe, metinsel olarakta z&#8217;den a&#8217;ya anlam\u0131n\u0131 ifade etmektedir. E\u011fer ki tam tersi bir s\u0131ralama isteniyorsa &#8220;1&#8221; de\u011feri verilmesi yeterlidir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nconst express = require(&quot;express&quot;);\r\nconst router = express.Router();\r\nconst employeeModel = require(&quot;..\/models\/employee&quot;);\r\nrouter.get(&quot;\/&quot;, (request, response, next) =&gt; {\r\n    employeeModel.find({}, (error, data) =&gt; {\r\n        if (!error)\r\n            response.json(data);\r\n        else\r\n            response.send(&quot;Beklenmeyen bir hata ile kar\u015f\u0131la\u015f\u0131ld\u0131.&quot;, error.message);\r\n    }).sort({ &quot;name&quot;: 1, &quot;_id&quot;: -1 });\r\n});\r\n\r\nmodule.exports = router;\r\n<\/pre>\n<p>Birden fazla kolonda s\u0131ralama yapmak istenirse yukar\u0131daki gibi \u00e7al\u0131\u015f\u0131labilmektedir. Burada \u00f6nce &#8220;name&#8221; kolonuna g\u00f6re a&#8217;dan z&#8217;ye ard\u0131ndan &#8220;_id&#8221; kolonuna g\u00f6rede b\u00fcy\u00fckten k\u00fc\u00e7\u00fc\u011fe bir s\u0131ralama ger\u00e7ekle\u015ftirilmi\u015ftir.<\/p>\n<h3>Limit Belirleme(limit)<\/h3>\n<p>Eldeki veri listesinin en ba\u015ftaki verisinden belirtilen adet kadar veriyi getirecektir. Klasik SQL&#8217;de ki &#8220;Top n&#8221; komutuna kar\u015f\u0131 gelmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nconst express = require(&quot;express&quot;);\r\nconst router = express.Router();\r\nconst employeeModel = require(&quot;..\/models\/employee&quot;);\r\nrouter.get(&quot;\/&quot;, (request, response, next) =&gt; {\r\n    employeeModel.find({}, (error, data) =&gt; {\r\n        if (!error)\r\n            response.json(data);\r\n        else\r\n            response.send(&quot;Beklenmeyen bir hata ile kar\u015f\u0131la\u015f\u0131ld\u0131.&quot;, error.message);\r\n    }).limit(2);\r\n});\r\nmodule.exports = router;\r\n<\/pre>\n<h3>Atlama(skip)<\/h3>\n<p>Veri listesinin ba\u015f\u0131ndan belirtilen de\u011fer kadar veriyi g\u00f6rmemezlikten gelecek gerisini getirecektir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nconst express = require(&quot;express&quot;);\r\nconst router = express.Router();\r\nconst employeeModel = require(&quot;..\/models\/employee&quot;);\r\nrouter.get(&quot;\/&quot;, (request, response, next) =&gt; {\r\n    employeeModel.find({}, (error, data) =&gt; {\r\n        if (!error)\r\n            response.json(data);\r\n        else\r\n            response.send(&quot;Beklenmeyen bir hata ile kar\u015f\u0131la\u015f\u0131ld\u0131.&quot;, error.message);\r\n    }).skip(2);\r\n});\r\nmodule.exports = router;\r\n<\/pre>\n<h3>Aggregate Operat\u00f6rleri<\/h3>\n<p>MongoDB&#8217;de aggregate operat\u00f6rleri klasik SQL&#8217;de ki &#8220;aggregate&#8221; fonksiyonlar\u0131yla ayn\u0131 \u00f6zellikleri bar\u0131nd\u0131rmakta ve orada hangi mant\u0131kta hangi durumlarda kullan\u0131l\u0131yorsa burada da ayn\u0131 mant\u0131k ve durumlar i\u00e7in kullan\u0131lan, aradaki tek fark\u0131n oradakinin fonksiyon buradakinin ise operat\u00f6r olmas\u0131 olan i\u015flevlerdir.<\/p>\n<p>Aggregate parametrelerini kullanabilmek i\u00e7in model \u00fczerinden aggregate fonksiyonunu \u00e7a\u011f\u0131rmal\u0131s\u0131n\u0131z. Birazdan g\u00f6rece\u011fimiz t\u00fcm operat\u00f6rler i\u00e7in a\u015fa\u011f\u0131daki yap\u0131sal durumu genelleyerek zihninizde oturtman\u0131z sizler i\u00e7in yap\u0131lar\u0131n kullan\u0131m\u0131na dair olduk\u00e7a kolayl\u0131k sa\u011flayacakt\u0131r.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n    model.aggregate(&#x5B;\r\n        {\r\n            &#x5B;$parametre]: {\r\n                &#x5B;...i\u015flemler...]\r\n            }\r\n        }\r\n    ], (error, data) =&gt; {\r\n\r\n    });\r\n<\/pre>\n<p>Yukar\u0131daki prototipi incelerseniz &#8220;aggregate&#8221; fonksiyonu i\u00e7erisinde bir dizi olu\u015fturulmakta ve kullan\u0131lacak operat\u00f6r bu dizi i\u00e7erisinde yarat\u0131lm\u0131\u015f bir object i\u00e7erisinde \u00e7a\u011fr\u0131lmaktad\u0131r. Ayn\u0131 \u015fekilde operat\u00f6rde i\u015flevselli\u011fi i\u00e7in bir ba\u015fka object&#8217;e ihtiya\u00e7 duymakta ve t\u00fcm i\u015flemler en alttaki objede ger\u00e7ekle\u015ftirilmektedir. T\u00fcm parametreler bu iskelette kullan\u0131ld\u0131\u011f\u0131ndan dolay\u0131 bu yap\u0131y\u0131 genelleyebilirsiniz.<\/p>\n<ul>\n<li>\n<strong>$match Operat\u00f6r\u00fc<\/strong><br \/>\nHerhangi bir kolona verilen de\u011fer ile e\u015fle\u015fen documentleri getiren operat\u00f6rd\u00fcr.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nconst express = require(&quot;express&quot;);\r\nconst router = express.Router();\r\nconst employeeModel = require(&quot;..\/models\/employee&quot;);\r\nrouter.get(&quot;\/&quot;, (request, response, next) =&gt; {\r\n    employeeModel.aggregate(&#x5B;\r\n        {\r\n            $match: {\r\n                name: &quot;Gen\u00e7ay&quot;\r\n            }\r\n        }\r\n    ], (error, data) =&gt; {\r\n        if (!error)\r\n            response.json(data);\r\n        else\r\n            response.send(&quot;Beklenmeyen bir hata ile kar\u015f\u0131la\u015f\u0131ld\u0131.&quot;, error.message);\r\n    });\r\n});\r\nmodule.exports = router;\r\n<\/pre>\n<p>&#8220;name&#8221; kolonu &#8220;Gen\u00e7ay&#8221; olan t\u00fcm documentleri getirecektir.<\/p>\n<p>E\u011fer birden fazla kolon \u00fczerinde e\u015fle\u015ftirme yapmak istiyorsan\u0131z kolonlar\u0131 a\u015fa\u011f\u0131daki gibi \u00e7o\u011faltabilirsiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n            $match: {\r\n                name: &quot;Gen\u00e7ay&quot;,\r\n                _id: 1\r\n            }\r\n.\r\n.\r\n.\r\n<\/pre>\n<\/li>\n<li>\n<strong>$group Operat\u00f6r\u00fc<\/strong><br \/>\nVerileri gruplamam\u0131z\u0131 ve grup i\u00e7i hesaplama yapmam\u0131z\u0131 sa\u011flayan operat\u00f6rd\u00fcr. Klasik SQL&#8217;de ki &#8220;Group By&#8221; komutuna kar\u015f\u0131l\u0131k gelmektedir.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/08\/NoSQL-MongoDB-\u0130\u015flevsel-Fonksiyonlar-ve-Aggregate-Operat\u00f6rleri.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/08\/NoSQL-MongoDB-\u0130\u015flevsel-Fonksiyonlar-ve-Aggregate-Operat\u00f6rleri.png\" alt=\"NoSQL - MongoDB \u0130\u015flevsel Fonksiyonlar ve Aggregate Operat\u00f6rleri\" width=\"488\" height=\"380\" class=\"aligncenter size-full wp-image-9122\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/08\/NoSQL-MongoDB-\u0130\u015flevsel-Fonksiyonlar-ve-Aggregate-Operat\u00f6rleri.png 488w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/08\/NoSQL-MongoDB-\u0130\u015flevsel-Fonksiyonlar-ve-Aggregate-Operat\u00f6rleri-300x234.png 300w\" sizes=\"auto, (max-width: 488px) 100vw, 488px\" \/><\/a><br \/>\n<em>Yukar\u0131daki listede ayn\u0131 isimde ka\u00e7 adet personel mevcuttur?<\/em> sorusuna kar\u015f\u0131l\u0131k her bir ismi gruplay\u0131p kar\u015f\u0131l\u0131\u011f\u0131nda ka\u00e7 adet kayd\u0131n oldu\u011funu a\u015fa\u011f\u0131daki \u015fekilde hesaplayabiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nconst express = require(&quot;express&quot;);\r\nconst router = express.Router();\r\nconst employeeModel = require(&quot;..\/models\/employee&quot;);\r\nrouter.get(&quot;\/&quot;, (request, response, next) =&gt; {\r\n    employeeModel.aggregate(&#x5B;\r\n        {\r\n            $group: {\r\n                _id: &quot;$name&quot;,\r\n                adet: { $sum: 1 }\r\n            }\r\n        }\r\n    ], (error, data) =&gt; {\r\n        if (!error)\r\n            response.json(data);\r\n        else\r\n            response.send(&quot;Beklenmeyen bir hata ile kar\u015f\u0131la\u015f\u0131ld\u0131.&quot;, error.message);\r\n    });\r\n});\r\nmodule.exports = router;\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funda $group operat\u00f6r\u00fcn\u00fc detayland\u0131rmak i\u00e7in a\u015fa\u011f\u0131 alal\u0131m;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n            $group: {\r\n                _id: &quot;$name&quot;,\r\n                adet: { $sum: 1 }\r\n            }\r\n.\r\n.\r\n.\r\n<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz \u00fczere &#8220;_id&#8221; alan\u0131na gruplama i\u015flemi yap\u0131lan kolon belirtilirken, ismi taraf\u0131m\u0131zca opsiyonel olarak verilebilen alana(adet) gruplanm\u0131\u015f de\u011fere kar\u015f\u0131l\u0131k toplam say\u0131 belirtilmi\u015ftir. Burada &#8220;_id&#8221; alan\u0131 birebir isimde zorunludur lakin &#8220;adet&#8221; alan\u0131n\u0131n ismine m\u00fcdahalede \u00f6zg\u00fcrs\u00fcn\u00fcz. Ayr\u0131ca gruplarda hesaplama yap\u0131l\u0131rken &#8220;$sum&#8221; toplamay\u0131, &#8220;$avg&#8221; ortalamay\u0131 bildirmektedir. T\u00fcm bunlar\u0131n d\u0131\u015f\u0131nda e\u011fer ki bir kolon ismiyle \u00e7al\u0131\u015fman\u0131z gerekecekse yukar\u0131da da g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8220;$&#8221; karakterini kolon isminin \u00f6n\u00fcne belirtmeniz gerekmektedir.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/08\/NoSQL-MongoDB-\u0130\u015flevsel-Fonksiyonlar-ve-Aggregate-Operat\u00f6rleri-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/08\/NoSQL-MongoDB-\u0130\u015flevsel-Fonksiyonlar-ve-Aggregate-Operat\u00f6rleri-1.png\" alt=\"NoSQL - MongoDB \u0130\u015flevsel Fonksiyonlar ve Aggregate Operat\u00f6rleri\" width=\"152\" height=\"299\" class=\"aligncenter size-full wp-image-9128\" \/><\/a><\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n            $group: {\r\n                _id: &quot;$name&quot;,\r\n                adet: { $avg: &quot;$age&quot; }\r\n            }\r\n.\r\n.\r\n.\r\n<\/pre>\n<p>E\u011fer yukar\u0131daki gibi kodumuzu geli\u015ftirseydik her bir grup i\u00e7erisinde ya\u015f ortalamas\u0131 al\u0131nm\u0131\u015f olacakt\u0131.\n<\/li>\n<li>\n<strong>$project Operat\u00f6r\u00fc<\/strong><br \/>\nSorgulama neticesinde gelen verilerden sadece istenilen alanlar\u0131 getirmemizi sa\u011flamaktad\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nconst express = require(&quot;express&quot;);\r\nconst router = express.Router();\r\nconst employeeModel = require(&quot;..\/models\/employee&quot;);\r\nrouter.get(&quot;\/&quot;, (request, response, next) =&gt; {\r\n    employeeModel.aggregate(&#x5B;\r\n        {\r\n            $project: {\r\n                surName: true,\r\n                age: true,\r\n                name: 1\r\n            }\r\n        }\r\n    ], (error, data) =&gt; {\r\n        if (!error)\r\n            response.json(data);\r\n        else\r\n            response.send(&quot;Beklenmeyen bir hata ile kar\u015f\u0131la\u015f\u0131ld\u0131.&quot;, error.message);\r\n    });\r\n});\r\nmodule.exports = router;\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere belirtilen kolonlara de\u011fer olarak &#8220;true&#8221; ya da &#8220;1&#8221; de\u011ferleri verilmi\u015ftir. Her iki de\u011ferde ayn\u0131 anlam\u0131 ifade etmekte ve ilgili kolonun g\u00f6sterilmesi gerekti\u011fini belirtmektedir. Yap\u0131ya dahil edilmeyen kolonlar ise dolay\u0131s\u0131yla g\u00f6sterilmeyecektir.\n<\/li>\n<li>\n<strong>$sort, $limit ve $skip Operat\u00f6rleri<\/strong><br \/>\n\u0130lgili i\u00e7eri\u011fimizde fonksiyonel denklerine ilk konular olarak i\u015flevsel a\u00e7\u0131dan de\u011findi\u011fimiz bu operat\u00f6rleri aggregate olarakta kullanabilmekteyiz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nconst express = require(&quot;express&quot;);\r\nconst router = express.Router();\r\nconst employeeModel = require(&quot;..\/models\/employee&quot;);\r\nrouter.get(&quot;\/&quot;, (request, response, next) =&gt; {\r\n    employeeModel.aggregate(&#x5B;\r\n        {\r\n            $sort: { _id: -1 }\r\n        },\r\n        {\r\n            $skip: 1\r\n        },\r\n        {\r\n            $limit: 2\r\n        }\r\n    ], (error, data) =&gt; {\r\n        if (!error)\r\n            response.json(data);\r\n        else\r\n            response.send(&quot;Beklenmeyen bir hata ile kar\u015f\u0131la\u015f\u0131ld\u0131.&quot;, error.message);\r\n    });\r\n});\r\nmodule.exports = router;\r\n<\/pre>\n<p>Burada yap\u0131sal olarak s\u0131ralamaya uygun bir i\u015flevsellik s\u00f6z konusu olacak ve \u00f6ncelikte $sort operat\u00f6r\u00fcnden dolay\u0131 &#8220;_id&#8221; kolonuna g\u00f6re b\u00fcy\u00fckten k\u00fc\u00e7\u00fc\u011fe s\u0131ralama i\u015flemi yap\u0131lacak, ard\u0131ndan $skip operat\u00f6r\u00fc bir adet eleman atlayacak ve son olarak $limit iki adet veriyi getirecektir.\n<\/li>\n<li>\n<strong>$lookup Operat\u00f6r\u00fc<\/strong><br \/>\nNoSQL yakla\u015f\u0131m\u0131ndan kaynakl\u0131 MongoDB&#8217;nin bir ili\u015fkisel veritaban\u0131 olmad\u0131\u011f\u0131n\u0131 biliyoruz. Ancak baz\u0131 durumlar vard\u0131r ki tablolar\/collectionlar aras\u0131 ili\u015fki kurulmadan devam edebilmek m\u00fcmk\u00fcn de\u011fildir. \u0130\u015fte b\u00f6yle gereksinim olan durumlarda $lookup operat\u00f6r\u00fc ile tablolar\u0131 ili\u015fkilendirebilmekteyiz.<\/p>\n<table>\n<thead>\n<tr>\n<th>Employee Collection<\/th>\n<th>Order Collection<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/08\/NoSQL-MongoDB-\u0130\u015flevsel-Fonksiyonlar-ve-Aggregate-Operat\u00f6rleri-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/08\/NoSQL-MongoDB-\u0130\u015flevsel-Fonksiyonlar-ve-Aggregate-Operat\u00f6rleri-2.png\" alt=\"NoSQL - MongoDB \u0130\u015flevsel Fonksiyonlar ve Aggregate Operat\u00f6rleri\" width=\"470\" height=\"379\" class=\"aligncenter size-full wp-image-9137\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/08\/NoSQL-MongoDB-\u0130\u015flevsel-Fonksiyonlar-ve-Aggregate-Operat\u00f6rleri-2.png 470w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/08\/NoSQL-MongoDB-\u0130\u015flevsel-Fonksiyonlar-ve-Aggregate-Operat\u00f6rleri-2-300x242.png 300w\" sizes=\"auto, (max-width: 470px) 100vw, 470px\" \/><\/a><\/td>\n<td><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/08\/NoSQL-MongoDB-\u0130\u015flevsel-Fonksiyonlar-ve-Aggregate-Operat\u00f6rleri-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/08\/NoSQL-MongoDB-\u0130\u015flevsel-Fonksiyonlar-ve-Aggregate-Operat\u00f6rleri-3.png\" alt=\"NoSQL - MongoDB \u0130\u015flevsel Fonksiyonlar ve Aggregate Operat\u00f6rleri\" width=\"313\" height=\"232\" class=\"aligncenter size-full wp-image-9138\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/08\/NoSQL-MongoDB-\u0130\u015flevsel-Fonksiyonlar-ve-Aggregate-Operat\u00f6rleri-3.png 313w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/08\/NoSQL-MongoDB-\u0130\u015flevsel-Fonksiyonlar-ve-Aggregate-Operat\u00f6rleri-3-300x222.png 300w\" sizes=\"auto, (max-width: 313px) 100vw, 313px\" \/><\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Yukar\u0131daki collection ekran g\u00f6r\u00fcnt\u00fclerini incelerseniz e\u011fer employee collection\u0131n\u0131n &#8220;_id&#8221; kolonu ile order collection\u0131n\u0131n &#8220;employeeId&#8221; kolonu mant\u0131ksal ili\u015fkiye sahiptir. \u015eimdi gelin bunu $lookup operat\u00f6r\u00fc ile fiziksel bir hale getirelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nconst express = require(&quot;express&quot;);\r\nconst router = express.Router();\r\nconst employeeModel = require(&quot;..\/models\/employee&quot;);\r\nrouter.get(&quot;\/&quot;, (request, response, next) =&gt; {\r\n    employeeModel.aggregate(&#x5B;\r\n        {\r\n            $lookup: {\r\n                from: &quot;order&quot;,\r\n                localField: &quot;_id&quot;,\r\n                foreignField: &quot;employeeId&quot;,\r\n                as: &quot;sipari\u015fler&quot;\r\n            }\r\n        }\r\n    ], (error, data) =&gt; {\r\n        if (!error)\r\n            response.json(data);\r\n        else\r\n            response.send(&quot;Beklenmeyen bir hata ile kar\u015f\u0131la\u015f\u0131ld\u0131.&quot;, error.message);\r\n    });\r\n});\r\nmodule.exports = router;\r\n<\/pre>\n<p>Yap\u0131y\u0131 optimize etmek i\u00e7in \u015f\u00f6yle a\u015fa\u011f\u0131ya alal\u0131m;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n            $lookup: {\r\n                from: &quot;order&quot;,\r\n                localField: &quot;_id&quot;,\r\n                foreignField: &quot;employeeId&quot;,\r\n                as: &quot;sipari\u015fler&quot;\r\n            }\r\n.\r\n.\r\n.\r\n<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz \u00fczere $lookup operat\u00f6r\u00fc i\u00e7erisinde birden fazla de\u011fer alarak iki tablo aras\u0131nda ili\u015fkilendirmeyi ger\u00e7ekle\u015ftirmi\u015f bulunmaktad\u0131r. <strong><em>Peki bu de\u011ferler neledir?<\/em><\/strong><\/p>\n<ul>\n<li>\n<em><strong><font style=\"color:gray;\">from<\/font><\/strong><\/em>: \u0130li\u015fki kurulacak collection ad\u0131n\u0131 tutar.\n<\/li>\n<li>\n<em><strong><font style=\"color:gray;\">localField<\/font><\/strong><\/em>: Modelde ili\u015fki kuracak kolon bilgisini tutar.\n<\/li>\n<li>\n<em><strong><font style=\"color:gray;\">foreignField<\/font><\/strong><\/em>: Di\u011fer collectiondaki ili\u015fki kurulacak kolon bilgisini tutar.\n<\/li>\n<li>\n<em><strong><font style=\"color:gray;\">as<\/font><\/strong><\/em>: \u0130li\u015fkilendirme sonucu gelen verilerin atanaca\u011f\u0131 alan\u0131n ad\u0131n\u0131 tutar.\n<\/li>\n<\/ul>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/08\/NoSQL-MongoDB-\u0130\u015flevsel-Fonksiyonlar-ve-Aggregate-Operat\u00f6rleri-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/08\/NoSQL-MongoDB-\u0130\u015flevsel-Fonksiyonlar-ve-Aggregate-Operat\u00f6rleri-4.png\" alt=\"NoSQL - MongoDB \u0130\u015flevsel Fonksiyonlar ve Aggregate Operat\u00f6rleri\" width=\"151\" height=\"582\" class=\"aligncenter size-full wp-image-9144\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/08\/NoSQL-MongoDB-\u0130\u015flevsel-Fonksiyonlar-ve-Aggregate-Operat\u00f6rleri-4.png 151w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/08\/NoSQL-MongoDB-\u0130\u015flevsel-Fonksiyonlar-ve-Aggregate-Operat\u00f6rleri-4-78x300.png 78w\" sizes=\"auto, (max-width: 151px) 100vw, 151px\" \/><\/a><\/p>\n<p>E\u011fer ki bu ili\u015fkilendirme sonucunda istenilen alanlar\u0131 g\u00f6stermek istiyorsan\u0131z a\u015fa\u011f\u0131dakilerin yap\u0131lmas\u0131 gerekmektedir;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nconst express = require(&quot;express&quot;);\r\nconst router = express.Router();\r\nconst employeeModel = require(&quot;..\/models\/employee&quot;);\r\nrouter.get(&quot;\/&quot;, (request, response, next) =&gt; {\r\n    employeeModel.aggregate(&#x5B;\r\n        {\r\n            $lookup: {\r\n                from: &quot;order&quot;,\r\n                localField: &quot;_id&quot;,\r\n                foreignField: &quot;employeeId&quot;,\r\n                as: &quot;sipari\u015fler&quot;\r\n            }\r\n        },\r\n        {\r\n            $unwind: &quot;$sipari\u015fler&quot;\r\n        },\r\n        {\r\n            $project: {\r\n\r\n                orderNumber: &quot;$sipari\u015fler.orderNumber&quot;,\r\n                name: 1\r\n            }\r\n        }\r\n    ], (error, data) =&gt; {\r\n        if (!error)\r\n            response.json(data);\r\n        else\r\n            response.send(&quot;Beklenmeyen bir hata ile kar\u015f\u0131la\u015f\u0131ld\u0131.&quot;, error.message);\r\n    });\r\n});\r\nmodule.exports = router;\r\n<\/pre>\n<p>Yukar\u0131daki yap\u0131lan i\u015flemlerde kar\u015f\u0131m\u0131za &#8220;$unwind&#8221; operat\u00f6r\u00fc \u00e7\u0131kmaktad\u0131r. \u015eimdi gelin yukar\u0131da ne yap\u0131ld\u0131\u011f\u0131na de\u011finirken bir yandan da &#8220;$unwind&#8221; operat\u00f6r\u00fcn\u00fcn ne i\u015fe yarad\u0131\u011f\u0131ndan bahsedelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n        {\r\n            $lookup: {\r\n                from: &quot;order&quot;,\r\n                localField: &quot;_id&quot;,\r\n                foreignField: &quot;employeeId&quot;,\r\n                as: &quot;sipari\u015fler&quot;\r\n            }\r\n        },\r\n        {\r\n            $unwind: &quot;$sipari\u015fler&quot;\r\n        },\r\n        {\r\n            $project: {\r\n\r\n                orderNumber: &quot;$sipari\u015fler.orderNumber&quot;,\r\n                name: 1\r\n            }\r\n        }\r\n.\r\n.\r\n.\r\n<\/pre>\n<p>G\u00f6stermek istedi\u011fimiz alanlar i\u00e7erisinde &#8220;sipari\u015fler&#8221; alan\u0131ndaki verileride g\u00f6stermek istersek bu alana $project i\u00e7erisinden eri\u015filebilmesi gerekmektedir. Dolay\u0131s\u0131yla $unwind bir ad\u0131m \u00f6nceki operat\u00f6rde yap\u0131lan \u00e7al\u0131\u015fma neticesinde olu\u015fturulan &#8220;sipari\u015fler&#8221; alan\u0131n\u0131 bir sonraki operat\u00f6re ta\u015f\u0131mam\u0131z\u0131 sa\u011flamakta ve i\u015flevsel olarak iki operat\u00f6r aras\u0131na girerek alan ta\u015f\u0131n\u0131m\u0131n\u0131 ger\u00e7ekle\u015ftirmektedir.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/08\/NoSQL-MongoDB-\u0130\u015flevsel-Fonksiyonlar-ve-Aggregate-Operat\u00f6rleri-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/08\/NoSQL-MongoDB-\u0130\u015flevsel-Fonksiyonlar-ve-Aggregate-Operat\u00f6rleri-5.png\" alt=\"NoSQL - MongoDB \u0130\u015flevsel Fonksiyonlar ve Aggregate Operat\u00f6rleri\" width=\"212\" height=\"242\" class=\"aligncenter size-full wp-image-9150\" \/><\/a>\n<\/li>\n<li>\n<strong>$exists Operat\u00f6r\u00fc<\/strong><br \/>\nKolon var m\u0131? yok mu? sorusuna kar\u015f\u0131l\u0131k kullan\u0131lan bir operat\u00f6rd\u00fcr.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nconst express = require(&quot;express&quot;);\r\nconst router = express.Router();\r\nconst employeeModel = require(&quot;..\/models\/employee&quot;);\r\nrouter.get(&quot;\/&quot;, (request, response, next) =&gt; {\r\n    employeeModel.find({\r\n        muiddin: {\r\n            $exists: false\r\n        }\r\n    }, (error, data) =&gt; {\r\n        if (!error)\r\n            response.json(data);\r\n        else\r\n            response.send(&quot;Beklenmeyen bir hata ile kar\u015f\u0131la\u015f\u0131ld\u0131.&quot;, error.message);\r\n    });\r\n});\r\nmodule.exports = router;\r\n<\/pre>\n<p>&#8220;muiddin&#8221; isminde kolonu olmayan listelenecektir. E\u011fer ki &#8220;true&#8221; de\u011ferini verseydik belirtilen isimde kolonu olanlar\u0131 listeletmi\u015f olacakt\u0131k.\n<\/li>\n<\/ul>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<\/p>\n<p>Sonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Klasik olarak veritaban\u0131ndan elde edilen veriler \u00fczerinde belli ba\u015fl\u0131 i\u015flemleri NoSQL sistemlerinde de uygulayabilmekteyiz. Bu i\u00e7eri\u011fimizde MongoDB veritaban\u0131nda bar\u0131nd\u0131r\u0131lan veriler \u00fczerinde s\u0131ralama, limit belirleme vs. gibi s\u0131radan i\u015flevlerle beraber $group, $lookup vs. gibi&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":8971,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2539,2145,2538],"tags":[2580,2572,2576,2574,2569,2573,2577,2575,2578,2579,2570,2571,2567,2568,2566],"class_list":["post-9097","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mongodb","category-node-js","category-nosql","tag-exists-operatoru","tag-group-operatoru","tag-limit-operatoru","tag-lookup-operatoru","tag-match-operatoru","tag-project-operatoru","tag-skip-operatoru","tag-sort-operatoru","tag-unwind-keyword","tag-unwind-operatoru","tag-aggregate-operatorleri","tag-mongodb-aggregate","tag-mongodb-limit","tag-mongodb-skip","tag-mongodb-sort"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/9097","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=9097"}],"version-history":[{"count":51,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/9097\/revisions"}],"predecessor-version":[{"id":9154,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/9097\/revisions\/9154"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/8971"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=9097"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=9097"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=9097"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}