Man: Hey, there. So in this video we're gonna keep
working with the aggregation pipeline.
And I really love this video because
in this one we're gonna solve a real business problem.
So let's imagine that we are really developing
this application for the Nature's Company.
And so let's say that they ask us
to implement a function to calculate
the busiest month of a given year.
So basically by calculating how many tours
start in each of the month of the given year.
And the company really needs this fine tune
to prepare accordingly for these tours,
like to hire tour guides or to buy the equipment
and handle all the stuff like that.
So this is a real business problem
that we now can solve
using aggregation pipelines. Okay?
And so, this is gonna be a real challenge
and I-- I hope it's gonna be really fun
to solve this kind of real business need.
At least if Nature's was a real business, I guess.
So, let's start by
again creating the function.
So export dot and I'm gonna call it:
get monthly plan.
All right.
And again it's gonna be a-- an async function
method, request response or try cache block
and I could actually just have gone and copied it
from up here.
But, nevermind. All right.
And uh now let's actually also uh implement the
route uh right here.
And I'm just gonna duplicate this line
so monthly plan...
And then here this one is called:
get monthly plan. And actually we wanna be able
to pass a year in the URL. And so let's use
a URL parameter for that. All right.
So uh...
coming back here let's start by
uh defining the year.
So the year is coming from req dot params dot year.
Remember that
and then again that trick to transform it
into a number. Okay?
Then I'm gonna create the plan variable
which is gonna await tour dot aggregate.
So just like before and for now
I'm gonna leave it empty here.
And I will copy this piece of code
to then send the results.
And this one is called plan and all right.
So now we're ready to start our aggregation pipeline
just like we did in the last video.
Now to start, let's actually take a look
at the complete results.
Just so we can get a better idea
of what we actually need to build here.
So let's do get all tours and get completely rid
of this query string.
And so here we have all nine tours
and each of the tours, remember, has an array
of these start dates.
So one tour will start on April 25th, 2021.
Then the next one starts on July 20th
and then October 5th. All right.
Then uh the next one has this start date
and all of them I believe have three starting dates.
Okay? So, these dates is what we actually need
as a starting point to create this function
or to create this aggregation pipeline.
Because remember, we want to count how many tours there are
for each of the months in a given year.
And so let's so that we're analyzing 2021, okay?
We have one tour in April, one in July, one in October.
Then let's take a look at the next tour.
Here we have one in June, one in July, and one in August.
So in July we already have two.
So this one and this one.
Next one we have uh, one in March, one in May,
and one in June. So in June we also already have two.
Okay? And so we can keep going and doing it manually
but of course we want to do it with our aggregation.
So if you want to add all of this together
the easiest way would basically be to have one tour
for each of these dates here, right?
And we can actually do that using the aggregation pipeline.
There is a stage for doing exactly that.
And that is called unwind.
So let's use it now and I will then show you
uh-- the result of it and why we really need it.
Okay? So, again we define an object
and then the name of the stage.
And in this case it is: unwind. Okay?
And what unwind is gonna do is basically deconstruct
an array field from the info documents
and then output one document for each element of the array.
And so that's what I was saying before.
Which is, that basically we want to have one tour
for each of these dates in the array. Okay?
And this stage can be really useful for so many cases.
So, the field with the array that we want to unwind
is start dates.
All right and so for now that's actually all.
So I just want to show you the result of that right now.
And I think we already actually have everything in place
for this to work. So just keep in mind
that the route is called monthly plan and then with a year.
Which for now it's not gonna have any results
but um, we have to define it anyway.
So monthly plan and the year of 2021.
So let's send this now.
And indeed we now have uh this start date
no longer as an array but only this first element
of the array that we had before.
Let's put them side-by-side. And so you see, we had
or actually let's do it with the first one.
So we had the first taker for April 25th,
July 20th, and October 5th.
And so now we have the first hiker on this date here,
then we have the first hiker on uh, July 20,
and now we will have the first hiker for October 5th.
So, exactly the result that we wanted
because now we have one document for each of the dates.
Okay? So instead of having nine, we now have 27
which is nine times three. All right.
So, that's the first date. Now let's actually go ahead
and select the documents for the year that was passed in.
Okay? And remember which stage we use for that
that's right, we use match.
So remember, match is basically to select documents.
So just to do a query.
And so the year is in the start dates.
So start dates is the one that we're gonna search for.
So start dates, and now what do we want?
Well we want the--the date basically to be greater
than January 1st of the current year,
so let's say 2021. And we want it to be less
than January 1st of 2022, all right.
So basically we want it to be 2020 and 2022. All right?
So let's put that in code now.
So start dates and then we need another object
for the operators. So, greater or equal than
and in MongoDB this works perfectly fine with dates.
So Mongo is actually perfect for working with dates like
doing date comparisons. So it works really great.
So now we actually need to define a new date here
so that, that one can then be compared with the date
that's in each of the documents.
So the formula of the date is year, month, and date.
And so let's do a template string here
and use our year variable.
So January 1st.
So, we want our date to be greater or equal than
January 1st, 2021 and let's actually write that here
just to keep it in mind. And we want it to be less
less than, or we can say less than, equal.
Let's go ahead and copy this one and then
December 31st. Okay? So, basically we want it to be between
the first day of the year and the last day
of the current year. Okay?
So let's keep testing it, so I will test it now
after each of the stages. So sending this
and now we should have only tours here that are in 2021.
So let's confirm that 2021, here as well, here as well,
here as well.
Mm, so you see we really have no other year. Right.
It's always 2021. Okay? So I think we've seen enough.
And so, let's go back. Next up is where the magic happens.
And so that is usually in the group stage.
So let's add the group here, so just like before
so group and remember we need to specify the ID field
basically to say what we want to use to group our documents.
Now we want to group them by the months, right?
But currently we simply have the entire date,
with the year, the month, the date, and even the hour.
So I guess it's 10 in the morning or something.
But again we only want the month. So let me show you
just another like magical MongoDB operator.
So, where is that? So, here, back in this reference here
we actually have a couple of aggregation pipeline operators.
And it's in here where we have this really handy uh
date operator. So let's take a look at this.
And the one that we're gonna use is month.
So it returns to month for a date as a number.
And so this will basically extract the month
out of our date. And there are lots of other operators.
Like this for example, we could even calculate the week
or just the year, okay?
But the week could also be very handy.
But let's uh, let's keep it with the month. All right?
So again, you can take a look at these uh--
special aggregation operators.
Because there are a ton of them, as you see here.
Okay? So actually these operators that we're using here
in the aggregation pipeline are uh, yeah exactly that.
They are aggregation pipeline operators.
We have stages and then operators that we can use. Okay.
And in this case, again, we use the month.
And then again the name of the field,
where we want to basically extract the date from.
All right, give it a save, then that error disappears, okay.
So we are grouping it now by the month.
And now the real information that we want
for each of the month is how many tours start in that month?
Right? And for that all we're gonna do is basically count
the amount of tours that have a certain month, right?
So num of tours starts.
And so this one is actually
very similar to what we did before.
So we use add and then for each of the documents
we add one. So just like we did before.
But actually it is sum and not add, okay so just like here
when we counted the tours for each of the difficulties
we simply added the number one for each of the documents.
And so here we do the same.
All right, so let's again test this.
And we're getting really close already to our end result.
And indeed, here we go. So we have February with one tour.
December with one tour, we have November or actually
September with two tours.
And then we have two tours in all of this in here
actually we have three tours in July.
So this is getting pretty close to our result.
So that's absolutely fantastic.
So this part here, which I think was the most difficult one
is already working.
All right.
Now we actually want some more information
which is not only how many tours
but also which tours? So let's do that.
So if you want information about which tours
that should actually be an array.
Right? Because how else would we specify
two or three different tours in one field, right?
And so basically we want to create an array
and we do that by using push
and then what we're gonna push into that array
as each document goes through this pipeline
is simply the name of the document,
or actually the name field. So not the name of the document
but the name field.
So in this case the name of the tour. Okay so let's test it.
And...
bam, here we go!
So we have also now the name of the tours in there.
So fantastic. Let's see, yeah. Here we have all the three.
Next up, let's actually uh change the name
of this field here, okay?
Now not really change but we're simply gonna add
another field which will have the same value here
so that later on we can basically delete this ID.
Okay, and so for that we're gonna use the next stage
which is called: add field.
So add field and this one
is pretty straight forward. It simply does what it says.
So add field is used to add fields and actually it is
called add fields.
And so now, the name that we want to add or the field
is called month and it has the value of
the field with the name ID.
All right. So, pretty straight forward
simply the name of the field and then the value.
Which as usual, we need to use the uh the dollar sign.
All right, just to test it again.
Indeed now we have the month.
Then next up, let's actually get rid of this
and so we use project.
So I'm really trying to put as many stages in here as I can
to-- to show you really everything I can.
So how does project work? Well we simply give
each of the field names a zero or a one.
So let me show that to you. So we can say ID
and set it to zero. And that will then make it so
the ID no longer shows up. If I put a one here, well,
then it would actually show up, okay?
So this one I'm not gonna test. Let me just add the next one
which is the sort one which I believe I used it before
but still I want to sort it here by the number or tours.
Okay, so right now it's not 100% useful we are still missing
because we should actually sort it by uh, really by the
number of tour starts.
So the name of the field is number of tour starts
and uh remember we had one before which was for ascending
and minus one which was for descending and of course
that's what we want.
So starting with the highest number.
So it should be three in our case and yeah, it is.
So July is the busiest month with three tour starts
the Forest Hiker, the Sea Explorer, and the Sports Lover.
Okay, so this is kind of done.
Let me just show you one, uh last stage here
which is uh, not really helpful here
but I wanted to show it to you anyway.
So we have the limit, and this one is exactly the same
as limit in uh query. So basically it is gonna allow us to
only uh, have six documents here.
Okay so basically six outputs.
Okay so let's test that, and so now indeed
we should only have six.
One, two, three, four, five, and six. All right.
Again, not really useful because that's uh gonna cutoff
the six least biggest month, which we don't want.
So let's simply set it to 12 here,
just so we can leave it here as a reference for you.
All right, so one more time but it, uh should be working now
and the real business problem is now solved.
And I know this is quite a lot of moving pieces
that we have here. A lot of different stages.
And so I know it's a lot for you to take in at this moment.
But don't worry, you don't have to know all of this stuff
all at the same time.
With practice you will keep improving
and you will know when to use which of the tools
that you have at your disposal.
Just keep in mind that you can always read the documentation
which is kind of complete and really great learning material
besides this course, okay?
And that applies to all of the technologies
that we're learning here.
So I really encourage you to always study the documentation.
And I know it can be really frightening to look at it
and without this course it would be a lot more difficult
to learn from the documentation
but with this really good starting point
that you get in these videos it's then a lot easier
for you to keep learning more and more uh,
using that documentation, okay?
So I wouldn't expect you to solve this challenge
on your own of course, which is why we basically
did it together here, right?
But I hope you had as much fun as I did
because again, I really love to solve this kind of problems
it's-- it's really fun I think.
But anyway, enough talking now.
In the rest of the section we will now talk about
a couple of uh, other features we have available to us
in Mongo, so that should be pretty fun as well.