Fetching Documents
Fetching documents using Mongez Aggregate class.
Introduction
As we saw, Aggregate
is a pipeline that hold multiple stages, we saw how to build the pipeline, now let's see how to fetch the documents.
Using get method
This is the most common method to fetch documents, it will return an array of documents.
Let's see an example
import { Aggregate } from "@mongez/monpulse";
const users = await new Aggregate("users").where("id", ">", 1500).get();
This will return list of documents for the users collection.
If we want to map the date before final return, we can pass a callback to the get
method.
const users = await new Aggregate("users").get((user) => {
user.age = new Date().getFullYear() - user.birthYear;
return user;
});
Get first document
To fetch only first matched document, we can use first
method.
const user = await new Aggregate("users").where("id", 1500).first();
If no results found, null
will be returned.
Get last document
Return last matched document.
const user = await new Aggregate("users").where("id", 1500).last();
Pagination
Another powerful feature of Aggregate
is pagination, we can use paginate
method to paginate the results.
const results = await new Aggregate("users").paginate(1, 10);
The first argument is the page number, and the second argument is the limit.
The results contains an object with the following structure:
export type PaginationInfo = {
/**
* Limit of the query
*/
limit: number;
/**
* Results of the query
*/
result: number;
/**
* Current page of the query
*/
page: number;
/**
* total results of the query
*/
total: number;
/**
* total pages of the query
*/
pages: number;
};
/**
* The result of the paginate query
*/
export type PaginationListing<T> = {
/**
* Results of the query
*/
documents: T[];
/**
* The pagination results
*/
paginationInfo: PaginationInfo;
};
So basically, it returns documents
and paginationInfo
object, the documents
is an array of documents, and the paginationInfo
contains the pagination information.
Count documents
To count the number of documents, we can use count
method.
const count = await new Aggregate("users").count();
Chunks
The chunk concept is to split the documents into multiple chunks, this will reduce the loaded documents in the memory especially if we have a large number of documents.
To use chunks, we can use chunk
method, it receives the limit
of documents per chunk and a callback to handle the chunk.
await new Aggregate("users").chunk(100, (users) => {
// handle the chunk
});
You can also receive the pagination information
in the second callback argument:
await new Aggregate("users").chunk(100, (users, pagination) => {
// handle the chunk
});
If you want to stop the chunking process, you can return false
from the callback.
Explain
Sometimes we need to know how the query is executed, we can use explain
method to get the execution plan of the query.
const results = await new Aggregate("users").explain();
See explain for more information.
Get certain field values
To get certain field values, we can use values
method.
const results = await new Aggregate("users").values("name");
This will return all values from all documents for the name
field.
Please note that the values
method will return an array of values, not an array of documents.
The returned values may return duplicated values, to get unique values, use unique
method.
Get Unique/Distinct values for a field
To get unique values for a given field, we can use unique
method.
const results = await new Aggregate("users").unique("name");
You can use
distinct
method as an alias forunique
method.
Get Heavy Unique/Distinct values for a field
In some scenarios, the unique values may contain null
value, to ensure only a non-null
values are returned, we can use uniqueHeavy
method.
const results = await new Aggregate("users").uniqueHeavy("name");
You can use
distinctHeavy
method as an alias foruniqueHeavy
method.