查询构建器
Pie 提供了丰富的查询方法,支持链式调用,让您能够构建复杂的查询条件。
// 精确匹配session.Where("status", "active")session.Where("age", 25)session.Where("email", "user@example.com")// 大于等于session.Where("age", pie.Gte("age", 18))
// 大于session.Where("age", pie.Gt("age", 18))
// 小于等于session.Where("age", pie.Lte("age", 65))
// 小于session.Where("age", pie.Lt("age", 65))
// 不等于session.Where("status", pie.Ne("status", "deleted"))
// 范围查询session.Where("age", pie.Between("age", 18, 65))session.Where("age", pie.NotBetween("age", 18, 65))// 包含在数组中session.WhereIn("role", []string{"admin", "user", "moderator"})session.WhereIn("status", []int{1, 2, 3})
// 不包含在数组中session.WhereNotIn("status", []string{"deleted", "banned"})
// 数组包含元素session.WhereArrayContains("tags", "golang")session.WhereArrayNotContains("tags", "deprecated")// 字段为空session.WhereNull("deleted_at")session.WhereNull("updated_at")
// 字段不为空session.WhereNotNull("email")session.WhereNotNull("phone")// LIKE 查询session.WhereLike("name", "%张%")session.WhereLike("email", "%@gmail.com")
// 前缀匹配session.WhereStartsWith("email", "admin")session.WhereStartsWith("domain", "www.")
// 后缀匹配session.WhereEndsWith("email", "@company.com")session.WhereEndsWith("file", ".pdf")
// 正则表达式session.WhereRegex("name", "^张")session.WhereRegex("email", "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$")// 全文搜索session.WhereText("golang mongodb tutorial")
// 指定语言session.WhereText("golang mongodb tutorial", "en")// 最近 N 天session.WhereRecentDays("created_at", 7)session.WhereRecentDays("updated_at", 30)
// 指定月份session.WhereMonth("created_at", time.Now().Month())session.WhereMonth("created_at", time.January)
// 指定年份session.WhereYear("created_at", 2024)session.WhereYear("created_at", 2023)
// 日期范围startDate := time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC)endDate := time.Date(2024, 12, 31, 23, 59, 59, 0, time.UTC)session.WhereBetween("created_at", startDate, endDate)
// 今天session.WhereToday("created_at")
// 昨天session.WhereYesterday("created_at")
// 本周session.WhereThisWeek("created_at")
// 上周session.WhereLastWeek("created_at")
// 本月session.WhereThisMonth("created_at")
// 上月session.WhereLastMonth("created_at")// 早于指定日期session.WhereBefore("created_at", time.Now().AddDate(0, -1, 0))
// 晚于指定日期session.WhereAfter("created_at", time.Now().AddDate(0, -6, 0))
// 在指定日期之后session.WhereSince("created_at", time.Now().AddDate(0, -1, 0))// 数组大小session.WhereArraySize("tags", 3)session.WhereArraySize("tags", pie.Gte("size", 1))
// 数组包含所有元素session.WhereArrayContainsAll("tags", []string{"golang", "mongodb"})
// 数组包含任意元素session.WhereArrayContainsAny("tags", []string{"golang", "python"})
// 数组为空session.WhereArrayEmpty("tags")
// 数组不为空session.WhereArrayNotEmpty("tags")嵌套数组查询
Section titled “嵌套数组查询”// 嵌套字段查询session.Where("address.city", "北京")session.Where("profile.settings.theme", "dark")
// 嵌套数组查询session.WhereArrayContains("users.roles", "admin")// AND 条件session.Where("status", "active"). Where("age", pie.Gte("age", 18)). Where("email", pie.Like("email", "%@company.com"))
// OR 条件session.Where("status", "active"). OrWhere("role", "admin")
// 复杂 OR 条件session.Where("status", "active"). OrWhere(func(q *pie.Query) { q.Where("role", "admin").WhereBetween("age", 30, 50) })
// NOT 条件session.WhereNot("status", "deleted")session.WhereNot("role", "guest")// 嵌套 ANDsession.Where(func(q *pie.Query) { q.Where("status", "active"). Where("age", pie.Gte("age", 18))}).Where("email", pie.Like("email", "%@company.com"))
// 嵌套 ORsession.Where(func(q *pie.Query) { q.Where("status", "active"). OrWhere("role", "admin")}).Where("age", pie.Between("age", 18, 65))
// 复杂嵌套session.Where(func(q *pie.Query) { q.Where("status", "active"). OrWhere(func(subQ *pie.Query) { subQ.Where("role", "admin"). Where("verified", true) })}).Where("age", pie.Gte("age", 18))// 单字段排序session.OrderBy("created_at")session.OrderByDesc("created_at")
// 多字段排序session.OrderBy("status").OrderByDesc("created_at")session.OrderBy("name").OrderBy("age")
// 随机排序session.OrderByRandom()// 限制数量session.Limit(10)
// 跳过记录session.Skip(20)
// 分页session.Skip(20).Limit(10)
// 获取最新记录session.Latest("created_at", 10)
// 获取最旧记录session.Oldest("created_at", 10)// 只选择指定字段session.Select("name", "email", "status")
// 排除指定字段session.Exclude("password", "secret_key")
// 选择嵌套字段session.Select("name", "profile.avatar", "settings.theme")// 总计数count, err := session.Count(ctx)
// 条件计数count, err := session.Where("status", "active").Count(ctx)
// 快速计数(不统计总数,更快)count, err := session.Where("status", "active").QuickCount(ctx)// 检查是否存在exists, err := session.Where("email", "test@example.com").Exists(ctx)
// 检查是否不存在notExists, err := session.Where("email", "test@example.com").NotExists(ctx)// 定义可复用的查询作用域func ActiveScope(field string) pie.ScopeFunc { return func(q *pie.Query) { q.Where(field, "active") }}
func RecentScope(field string, days int) pie.ScopeFunc { return func(q *pie.Query) { q.WhereRecentDays(field, days) }}
func AdultScope(field string) pie.ScopeFunc { return func(q *pie.Query) { q.Where(field, pie.Gte(field, 18)) }}// 应用单个作用域users, err := session.Scopes(ActiveScope("status")).Find(ctx)
// 应用多个作用域users, err = session.Scopes( ActiveScope("status"), RecentScope("created_at", 30), AdultScope("age"),).Find(ctx)
// 作用域与普通条件组合users, err = session. Scopes(ActiveScope("status")). Where("email", pie.Like("email", "%@company.com")). Find(ctx)查询链式调用
Section titled “查询链式调用”Pie 的查询构建器支持链式调用,让您能够构建复杂的查询:
users, err := session. Where("status", "active"). Where("age", pie.Between("age", 18, 65)). WhereIn("role", []string{"user", "premium"}). WhereNotNull("email"). WhereLike("name", "%张%"). OrderBy("created_at"). Limit(20). Find(ctx)// 确保查询字段有索引session.Where("email", "test@example.com") // email 字段应该有索引session.Where("status", "active").OrderBy("created_at") // 复合索引 (status, created_at)// 只选择需要的字段,减少数据传输users, err := session. Select("name", "email", "status"). Where("status", "active"). Find(ctx)限制结果数量
Section titled “限制结果数量”// 使用 Limit 避免返回过多数据users, err := session. Where("status", "active"). Limit(100). Find(ctx)