π MongoDB Basic Aggregation β Full Guide (Markdown)
β
BASE SETUP (Express + Mongoose)
const UserSchema = new mongoose . Schema ( {
name : String ,
age : Number ,
email : String ,
isActive : Boolean ,
city : String
} ) ;
const User = mongoose . model ( "User" , UserSchema ) ;
app . get ( "/api/users/basic" , async ( req , res ) => {
try {
const result = await User . aggregate ( [
// aggregation stages here
] ) ;
res . json ( result ) ;
} catch ( err ) {
res . status ( 500 ) . json ( { error : err . message } ) ;
}
} ) ;
π© 1οΈβ£ $match β Filter Documents
{
$match : { field : value }
}
Purpose
Example
Equal match
{ age: 25 }
Greater than
{ age: { $gt: 20 } }
AND condition
{ age: { $gt: 18 }, isActive: true }
OR condition
{ $or: [{ city: "Hyd" }, { age: { $lt: 18 } }] }
{ $match : { isActive : true } }
[
{ "name" : " Suhail" , "isActive" : true },
{ "name" : " Ali" , "isActive" : true }
]
π¦ 2οΈβ£ $project β Select / Hide Fields
{
$project : {
field1 : 1 ,
field2 : 0 ,
newField : "$oldField"
}
}
You cannot mix 1 and 0 in the same projection except _id: 0.
{
$project : {
name : 1 ,
age : 1 ,
_id : 0
}
}
[
{ "name" : " Suhail" , "age" : 23 },
{ "name" : " Ali" , "age" : 27 }
]
π¨ 3οΈβ£ $addFields β Add New or Modify Fields
{
$addFields : {
newField : expression
}
}
Expression
Meaning
{ $toUpper: "$name" }
Convert string to uppercase
{ $concat: ["Hello ", "$name"] }
Concatenate
{ $sum: ["$field1", "$field2"] }
Add values
{ $multiply: ["$price", 2] }
Multiply
{
$addFields : {
nameUpper : { $toUpper : "$name" } ,
isAdult : { $gt : [ "$age" , 17 ] }
}
}
[
{ "name" : " Suhail" , "age" : 23 , "nameUpper" : " SUHAIL" , "isAdult" : true }
]
π₯ 4οΈβ£ $sort β Sort Documents
{
$sort: { field: 1 or - 1 }
}
Value
Meaning
1
Ascending
-1
Descending
[
{ "name" : " Ali" , "age" : 30 },
{ "name" : " Suhail" , "age" : 23 }
]
π« 5οΈβ£ $skip β Skip N Documents
π§ 6οΈβ£ $limit β Limit Number of Documents
π© 7οΈβ£ $count β Count Documents
{ $match : { isActive : true } } ,
{ $count : "activeUsers" }
[
{ "activeUsers" : 42 }
]
π FULL EXAMPLE β All Basic Stages Combined
app . get ( "/api/users/basic" , async ( req , res ) => {
try {
const result = await User . aggregate ( [
// 1οΈβ£ Filter users
{ $match : { isActive : true } } ,
// 2οΈβ£ Add computed fields
{
$addFields : {
nameUpper : { $toUpper : "$name" }
}
} ,
// 3οΈβ£ Select fields
{
$project : {
name : 1 ,
age : 1 ,
nameUpper : 1 ,
email : 1 ,
_id : 0
}
} ,
// 4οΈβ£ Sort by age (descending)
{ $sort : { age : - 1 } } ,
// 5οΈβ£ Skip 0 docs
{ $skip : 0 } ,
// 6οΈβ£ Limit results to 10
{ $limit : 10 }
// 7οΈβ£ Count docs (use separate route)
// { $count: "total" }
] ) ;
res . json ( result ) ;
} catch ( err ) {
res . status ( 500 ) . json ( { error : err . message } ) ;
}
} ) ;