Aggregation
Aggregation Queries
Section titled “Aggregation Queries”Pie provides a powerful aggregation framework with stage builders and expression functions for complex data processing.
Basic Aggregation
Section titled “Basic Aggregation”// Create aggregation operationaggregate := pie.NewAggregate[User](engine). CollectionForStruct(User{})
// Use stage builders to build aggregation pipelineresult, err := aggregate. MatchStage().Where("status", "active"). GroupStage(). By("role", "$role"). Count("total"). Avg("avgAge", "$age"). Max("maxAge", "$age"). Min("minAge", "$age"). Done(). SortStage().Desc("total"). Exec(ctx)
// Process resultsfor _, item := range result.Data { // item is bson.M type}Advanced Aggregation with Expressions
Section titled “Advanced Aggregation with Expressions”// Complex aggregation with expressionsresult, err := aggregate. MatchStage(). Where("active", true). Between("age", 18, 65). In("status", "active", "pending"). AddFieldsStage(). Add("ageGroup", pie.Cond( pie.GteExpr("$age", 30), "adult", "young", )). Add("fullName", pie.Concat("$firstName", " ", "$lastName")). Add("scoreRounded", pie.Round("$score", 1)). Done(). GroupStage(). By("ageGroup", "$ageGroup"). Count("total"). Avg("avgScore", "$score"). Push("names", "$fullName"). Done(). ProjectStage(). Include("ageGroup", "total", "avgScore", "names"). Field("nameCount", pie.SizeArray("$names")). Done(). SortStage().Desc("total"). LimitStage(10). Exec(ctx)Join Operations
Section titled “Join Operations”// Join with orders collectionresult, err := aggregate. LookupStage("orders", "_id", "user_id", "user_orders"). Pipeline( bson.M{"$match": bson.M{"status": "completed"}}, bson.M{"$limit": 5}, ). Done(). AddFieldsStage(). Add("orderCount", pie.SizeArray("$user_orders")). Add("totalSpent", pie.Sum("$user_orders.amount")). Done(). MatchStage().Where("orderCount", pie.GtExpr(0, 0)). ProjectStage(). Include("name", "email", "orderCount", "totalSpent"). Done(). Exec(ctx)Facet Analysis
Section titled “Facet Analysis”// Multi-dimensional analysis using facetsresult, err := aggregate. FacetStage(). Facet("activeUsers", bson.M{"$match": bson.M{"active": true}}, bson.M{"$count": "count"}, ). Facet("scoreStats", bson.M{"$group": bson.M{ "_id": nil, "avgScore": bson.M{"$avg": "$score"}, "maxScore": bson.M{"$max": "$score"}, "minScore": bson.M{"$min": "$score"}, }}, ). Facet("ageGroups", bson.M{"$bucket": bson.M{ "groupBy": "$age", "boundaries": []int{0, 25, 30, 35, 100}, "default": "other", "output": bson.M{"count": bson.M{"$sum": 1}}, }}, ). Done(). Exec(ctx)Next Steps
Section titled “Next Steps”- Transactions - Use transactions
- Advanced Aggregation - Learn advanced aggregation features
- Performance - Learn performance optimization