Query Builder
Smart Query Builder
Section titled “Smart Query Builder”Pie provides rich query methods with chainable calls:
// Basic queriessession.Where("status", "active")session.Where("age", pie.Gte("age", 18))session.WhereIn("role", []string{"admin", "user"})session.WhereBetween("age", 18, 65)session.WhereNull("deleted_at")session.WhereNotNull("email")
// Fuzzy queriessession.WhereLike("name", "%John%")session.WhereStartsWith("email", "admin")session.WhereEndsWith("domain", ".com")
// Date queriessession.WhereRecentDays("created_at", 7)session.WhereMonth("created_at", time.Now().Month())session.WhereYear("created_at", 2024)
// Complex conditionssession.Where("status", "active"). OrWhere(func(q *pie.Query) { q.Where("role", "admin").WhereBetween("age", 30, 50) })Query Methods
Section titled “Query Methods”Comparison Operators
Section titled “Comparison Operators”// Equalsession.Where("status", "active")
// Not equalsession.Where("status", pie.Ne("status", "inactive"))
// Greater thansession.Where("age", pie.Gt("age", 18))
// Greater than or equalsession.Where("age", pie.Gte("age", 18))
// Less thansession.Where("age", pie.Lt("age", 65))
// Less than or equalsession.Where("age", pie.Lte("age", 65))
// Betweensession.WhereBetween("age", 18, 65)
// Not betweensession.WhereNotBetween("age", 18, 65)Array Operations
Section titled “Array Operations”// In arraysession.WhereIn("role", []string{"admin", "user"})
// Not in arraysession.WhereNotIn("role", []string{"guest"})
// Array containssession.WhereArrayContains("tags", "golang")
// Array sizesession.WhereArraySize("tags", 3)String Operations
Section titled “String Operations”// Like (regex)session.WhereLike("name", "%John%")
// Starts withsession.WhereStartsWith("email", "admin")
// Ends withsession.WhereEndsWith("domain", ".com")
// Regexsession.WhereRegex("name", "^[A-Z]")Null Operations
Section titled “Null Operations”// Is nullsession.WhereNull("deleted_at")
// Is not nullsession.WhereNotNull("email")
// Is emptysession.WhereEmpty("description")
// Is not emptysession.WhereNotEmpty("description")Date Operations
Section titled “Date Operations”// Recent dayssession.WhereRecentDays("created_at", 7)
// Recent hourssession.WhereRecentHours("updated_at", 24)
// Specific monthsession.WhereMonth("created_at", time.January)
// Specific yearsession.WhereYear("created_at", 2024)
// Date rangesession.WhereDateBetween("created_at", startDate, endDate)Complex Queries
Section titled “Complex Queries”Logical Operators
Section titled “Logical Operators”// AND conditionssession.Where("status", "active"). Where("role", "user"). Where("age", pie.Gte("age", 18))
// OR conditionssession.Where("status", "active"). OrWhere("role", "admin")
// Nested conditionssession.Where("status", "active"). OrWhere(func(q *pie.Query) { q.Where("role", "admin"). Where("verified", true) })Subqueries
Section titled “Subqueries”// Exists subquerysession.WhereExists(func(q *pie.Query) { q.Table("orders"). Where("user_id", pie.Raw("users._id")). Where("status", "completed")})
// Not exists subquerysession.WhereNotExists(func(q *pie.Query) { q.Table("orders"). Where("user_id", pie.Raw("users._id"))})Raw Queries
Section titled “Raw Queries”// Raw MongoDB querysession.WhereRaw(bson.D{ {"$or", []bson.D{ {{"age", bson.D{{"$gte", 18}}}}, {{"role", "admin"}}, }},})
// Raw aggregationsession.AggregateRaw(bson.A{ bson.D{{"$match", bson.D{{"status", "active"}}}}, bson.D{{"$group", bson.D{ {"_id", "$role"}, {"count", bson.D{{"$sum", 1}}}, }}},})Query Execution
Section titled “Query Execution”Find Operations
Section titled “Find Operations”// Find allusers, err := session.Find(ctx)
// Find firstuser, err := session.FindOne(ctx)
// Find first without error when not founduser, err := session.FirstOne(ctx)
// Find with limitusers, err := session.Limit(10).Find(ctx)
// Find with offsetusers, err := session.Offset(20).Find(ctx)
// Find with orderusers, err := session.OrderBy("name").Find(ctx)Count Operations
Section titled “Count Operations”// Count allcount, err := session.Count(ctx)
// Count with conditionscount, err := session.Where("status", "active").Count(ctx)
// Exists checkexists, err := session.Where("email", "test@example.com").Exists(ctx)Update Operations
Section titled “Update Operations”// Update oneresult, err := session. Where("email", "test@example.com"). Update(ctx, bson.D{{"$set", bson.D{{"status", "active"}}}})
// Update manyresult, err := session. Where("role", "guest"). UpdateMany(ctx, bson.D{{"$set", bson.D{{"role", "user"}}}})
// Upsertresult, err := session. Where("email", "test@example.com"). Upsert(ctx, bson.D{{"$set", bson.D{{"name", "Test User"}}}})Delete Operations
Section titled “Delete Operations”// Delete oneresult, err := session. Where("email", "test@example.com"). Delete(ctx)
// Delete manyresult, err := session. Where("status", "inactive"). DeleteMany(ctx)Performance Tips
Section titled “Performance Tips”Index Usage
Section titled “Index Usage”// Use indexed fields for better performancesession.Where("email", "test@example.com") // email has indexsession.Where("created_at", pie.Gte("created_at", time.Now().AddDate(0, -1, 0))) // created_at has indexQuery Optimization
Section titled “Query Optimization”// Use projection to limit returned fieldsusers, err := session. Select("name", "email"). // Only select needed fields Where("status", "active"). Find(ctx)
// Use limit to avoid large result setsusers, err := session. Where("status", "active"). Limit(100). // Limit result size Find(ctx)Caching
Section titled “Caching”// Cache query resultsusers, err := session. Where("status", "active"). Cache("active_users", 5*time.Minute). // Cache for 5 minutes Find(ctx)Next Steps
Section titled “Next Steps”- Generics Guide - Learn about generics usage and benefits
- Struct Query - Convert HTTP params to queries
- Pagination - Implement pagination
- Cursor Operations - Use cursors for large datasets
- Aggregation - Advanced aggregation queries