Model Aggregate
Combine Models with Aggregate Class.
Introduction
We previously saw how Aggregate class work, also we had a pretty good look at the Model class as well, now let's see how we can combine them together.
Model Aggregate Class
Each model by default has an aggregate method which returns an instance of ModelAggregate class, this class extends the Aggregate class and adds some useful methods to to, also it manipulates it to match the model nature and behavior.
Example of usage
Let's say we have a User model, and we want to get the average age of all users.
import { Model } from "@mongez/monpulse";
export class User extends Model {
/**
* {@inheritDoc}
*/
public static collection = "users";
}
Now let's use the aggregate method to get the average age of all users.
import { User } from "./models/user";
const users = await User.aggregate().where("age", ">", 18).get();
console.log(users);
Unlike the base Aggregate class, the ModelAggregate's get method returns an array of models instead of plain objects, so we can use the model methods on the returned documents.
If yoy want to override the returned model, pass the first argument with a callback to the get method.
const users = await User.aggregate()
.where("age", ">", 18)
.get((user) => {
return {
...user,
fullName: `${user.firstName} ${user.lastName}`,
};
});
This would return an array of objects with the fullName property, but not an instance of User model.
Return first model
To return the first model, we can use the first method.
const user = await User.aggregate().where("age", ">", 18).first();
Pagination
Pagination works exactly like normal Aggregate.paginate method but the returned documents are instances of the model.
const { documents: users, paginationInfo } = await User.aggregate()
.where("age", ">", 18)
.paginate(1, 10);
Chunk
Chunk method is also available, it works exactly like the Aggregate.chunk method but the returned documents are instances of the model.
await User.aggregate().where("age", ">", 18).chunk(10, (users) => {
console.log(users);
});