Skip to main content

MONGODB AGGREGATION FRAMEWORK FOR BEGINNERS

The mongoDB aggregation framework is one part of Mongo that used to scare me a lot when I was starting out and I think the same is true for a lot of beginners. The entire concept is a bit tricky to wrap your head around and people usually tend to avoid using aggregations as a whole.
In this article I’ll try to explain the aggregation framework in as easy words as possible and probably try to remove this fear of aggregation from some people’s minds.

What is aggregation ?

Aggregation is nothing but just another query method that you can use to find your documents in mongoDB. What is special about it is the way it processes the data and takes the data through stages, filtering in each stage and giving the data ahead (more explanation on it later).
What you need to get into your mind is that aggregation is nothing but just another way to findrecords.

How do aggregations work ?

This is where aggregation is really special and operates in a different way to the normal find queries. What the aggregation framework does is operate in stages, i.e, it does the first operation on the collection , gets a list of documents as the result and then the next operation will be done only on the result of the first operation.
Think of it as an imaginary pipeline, the results of the last stage are the only ones used in the further stages.
The first operation (usually the match operation) is the one that is run on the entire collection. Also, to be noted is that the first stage of the process is the one that benefits from any indexes that you have put up on the collection. The output of the first operation then serves as the input for the next and so on… until we get the output documents.

groupBy with aggregation

One of the biggest advantages of the aggregate framework is it’s ability to give us the GROUP BY sql feature in mongoDB. To have a deeper look at how the aggregate framework uses $group for grouping documents you can take a look at this article -> https://easyontheweb.com/group-by-in-mongoose-with-lookup/
With the $group feature comes in a lot of other powers that the aggregate framework gives us. We can add custom fields or values to intermediate results while going through the stages to the next operation to operate on.

How to use aggregate?

This query shows the three most important aspects of the aggregate framework. We first write a $match that is the query that we would write in the find of the simple mongoDB searching . Next, we group the documents matching the $match conditions by the “age”. Note that we use $ to access the fields of the last result in the pipeline , that is why $age is used.
The third thing we use is the addition of new fields to the resulting documents, we create the fields “women” and “total” where we are storing the name and sum of women we’ve found in the point up till that stage.
What I would recommend you to do is start by writing easy small aggregates and then move to advanced concepts and complex queries with $unwind etc. The aggregate framework is great and is a must for grouping data so you have to face it one day or the other.

Comments

Popular posts from this blog

How to use Ngx-Charts in Angular ?

Charts helps us to visualize large amount of data in an easy to understand and interactive way. This helps businesses to grow more by taking important decisions from the data. For example, e-commerce can have charts or reports for product sales, with various categories like product type, year, etc. In angular, we have various charting libraries to create charts.  Ngx-charts  is one of them. Check out the list of  best angular chart libraries .  In this article, we will see data visualization with ngx-charts and how to use ngx-charts in angular application ? We will see, How to install ngx-charts in angular ? Create a vertical bar chart Create a pie chart, advanced pie chart and pie chart grid Introduction ngx-charts  is an open-source and declarative charting framework for angular2+. It is maintained by  Swimlane . It is using Angular to render and animate the SVG elements with all of its binding and speed goodness and uses d3 for the excellent math functio...

Understand Angular’s forRoot and forChild

  forRoot   /   forChild   is a pattern for singleton services that most of us know from routing. Routing is actually the main use case for it and as it is not commonly used outside of it, I wouldn’t be surprised if most Angular developers haven’t given it a second thought. However, as the official Angular documentation puts it: “Understanding how  forRoot()  works to make sure a service is a singleton will inform your development at a deeper level.” So let’s go. Providers & Injectors Angular comes with a dependency injection (DI) mechanism. When a component depends on a service, you don’t manually create an instance of the service. You  inject  the service and the dependency injection system takes care of providing an instance. import { Component, OnInit } from '@angular/core'; import { TestService } from 'src/app/services/test.service'; @Component({ selector: 'app-test', templateUrl: './test.component.html', styleUrls: ['./test.compon...

How to solve Puppeteer TimeoutError: Navigation timeout of 30000 ms exceeded

During the automation of multiple tasks on my job and personal projects, i decided to move on  Puppeteer  instead of the old school PhantomJS. One of the most usual problems with pages that contain a lot of content, because of the ads, images etc. is the load time, an exception is thrown (specifically the TimeoutError) after a page takes more than 30000ms (30 seconds) to load totally. To solve this problem, you will have 2 options, either to increase this timeout in the configuration or remove it at all. Personally, i prefer to remove the limit as i know that the pages that i work with will end up loading someday. In this article, i'll explain you briefly 2 ways to bypass this limitation. A. Globally on the tab The option that i prefer, as i browse multiple pages in the same tab, is to remove the timeout limit on the tab that i use to browse. For example, to remove the limit you should add: await page . setDefaultNavigationTimeout ( 0 ) ;  COPY SNIPPET The setDefaultNav...