Files
kratos-bootstrap/database/mongodb/query.go
2025-06-29 09:29:47 +08:00

230 lines
6.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package mongodb
import (
bsonV2 "go.mongodb.org/mongo-driver/v2/bson"
optionsV2 "go.mongodb.org/mongo-driver/v2/mongo/options"
)
type QueryBuilder struct {
filter bsonV2.M
opts *optionsV2.FindOptions
pipeline []bsonV2.M
}
func NewQuery() *QueryBuilder {
return &QueryBuilder{
filter: bsonV2.M{},
opts: &optionsV2.FindOptions{},
}
}
// SetFilter 设置查询过滤条件
func (qb *QueryBuilder) SetFilter(filter bsonV2.M) *QueryBuilder {
qb.filter = filter
return qb
}
// SetOr 设置多个条件的逻辑或
func (qb *QueryBuilder) SetOr(conditions []bsonV2.M) *QueryBuilder {
qb.filter[OperatorOr] = conditions
return qb
}
// SetAnd 设置多个条件的逻辑与
func (qb *QueryBuilder) SetAnd(conditions []bsonV2.M) *QueryBuilder {
qb.filter[OperatorAnd] = conditions
return qb
}
// SetNotEqual 设置字段的不等于条件
func (qb *QueryBuilder) SetNotEqual(field string, value interface{}) *QueryBuilder {
qb.filter[field] = bsonV2.M{OperatorNe: value}
return qb
}
// SetGreaterThan 设置字段的大于条件
func (qb *QueryBuilder) SetGreaterThan(field string, value interface{}) *QueryBuilder {
qb.filter[field] = bsonV2.M{OperatorGt: value}
return qb
}
// SetLessThan 设置字段的小于条件
func (qb *QueryBuilder) SetLessThan(field string, value interface{}) *QueryBuilder {
qb.filter[field] = bsonV2.M{OperatorLt: value}
return qb
}
// SetExists 设置字段是否存在条件
func (qb *QueryBuilder) SetExists(field string, exists bool) *QueryBuilder {
qb.filter[field] = bsonV2.M{OperatorExists: exists}
return qb
}
// SetType 设置字段的类型条件
func (qb *QueryBuilder) SetType(field string, typeValue interface{}) *QueryBuilder {
qb.filter[field] = bsonV2.M{OperatorType: typeValue}
return qb
}
// SetBetween 设置字段的范围查询条件
func (qb *QueryBuilder) SetBetween(field string, start, end interface{}) *QueryBuilder {
qb.filter[field] = bsonV2.M{
OperatorGte: start,
OperatorLte: end,
}
return qb
}
// SetIn 设置字段的包含条件
func (qb *QueryBuilder) SetIn(field string, values []interface{}) *QueryBuilder {
qb.filter[field] = bsonV2.M{OperatorIn: values}
return qb
}
// SetNotIn 设置字段的排除条件
func (qb *QueryBuilder) SetNotIn(field string, values []interface{}) *QueryBuilder {
qb.filter[field] = bsonV2.M{OperatorNin: values}
return qb
}
// SetElemMatch 设置数组字段的匹配条件
func (qb *QueryBuilder) SetElemMatch(field string, match bsonV2.M) *QueryBuilder {
qb.filter[field] = bsonV2.M{OperatorElemMatch: match}
return qb
}
// SetAll 设置字段必须包含所有指定值的条件
func (qb *QueryBuilder) SetAll(field string, values []interface{}) *QueryBuilder {
qb.filter[field] = bsonV2.M{OperatorAll: values}
return qb
}
// SetSize 设置数组字段的大小条件
func (qb *QueryBuilder) SetSize(field string, size int) *QueryBuilder {
qb.filter[field] = bsonV2.M{OperatorSize: size}
return qb
}
// SetCurrentDate 设置字段为当前日期
func (qb *QueryBuilder) SetCurrentDate(field string) *QueryBuilder {
qb.filter[field] = bsonV2.M{OperatorCurrentDate: true}
return qb
}
// SetTextSearch 设置文本搜索条件
func (qb *QueryBuilder) SetTextSearch(search string) *QueryBuilder {
qb.filter[OperatorText] = bsonV2.M{OperatorSearch: search}
return qb
}
// SetMod 设置字段的模运算条件
func (qb *QueryBuilder) SetMod(field string, divisor, remainder int) *QueryBuilder {
qb.filter[field] = bsonV2.M{OperatorMod: []int{divisor, remainder}}
return qb
}
// SetRegex 设置正则表达式查询条件
func (qb *QueryBuilder) SetRegex(field string, pattern string) *QueryBuilder {
qb.filter[field] = bsonV2.M{OperatorRegex: pattern}
return qb
}
// SetGeoWithin 设置地理位置范围查询条件
func (qb *QueryBuilder) SetGeoWithin(field string, geometry bsonV2.M) *QueryBuilder {
qb.filter[field] = bsonV2.M{OperatorGeoWithin: geometry}
return qb
}
// SetGeoIntersects 设置地理位置相交查询条件
func (qb *QueryBuilder) SetGeoIntersects(field string, geometry bsonV2.M) *QueryBuilder {
qb.filter[field] = bsonV2.M{OperatorGeoIntersects: geometry}
return qb
}
// SetNear 设置地理位置附近查询条件
func (qb *QueryBuilder) SetNear(field string, point bsonV2.M, maxDistance, minDistance float64) *QueryBuilder {
qb.filter[field] = bsonV2.M{
OperatorNear: bsonV2.M{
OperatorGeometry: point,
OperatorMaxDistance: maxDistance,
OperatorMinDistance: minDistance,
},
}
return qb
}
// SetNearSphere 设置球面距离附近查询条件
func (qb *QueryBuilder) SetNearSphere(field string, point bsonV2.M, maxDistance, minDistance float64) *QueryBuilder {
qb.filter[field] = bsonV2.M{
OperatorNearSphere: bsonV2.M{
OperatorGeometry: point,
OperatorMaxDistance: maxDistance,
OperatorMinDistance: minDistance,
},
}
return qb
}
// SetLimit 设置查询结果的限制数量
func (qb *QueryBuilder) SetLimit(limit int64) *QueryBuilder {
if qb.opts == nil {
qb.opts = &optionsV2.FindOptions{}
}
qb.opts.Limit = &limit
return qb
}
// SetSort 设置查询结果的排序条件
func (qb *QueryBuilder) SetSort(sort bsonV2.D) *QueryBuilder {
if qb.opts == nil {
qb.opts = &optionsV2.FindOptions{}
}
qb.opts.Sort = sort
return qb
}
// SetSortWithPriority 设置查询结果的排序条件,并指定优先级
func (qb *QueryBuilder) SetSortWithPriority(sortFields []bsonV2.E) *QueryBuilder {
if qb.opts == nil {
qb.opts = &optionsV2.FindOptions{}
}
qb.opts.Sort = bsonV2.D(sortFields)
return qb
}
// SetProjection 设置查询结果的字段投影
func (qb *QueryBuilder) SetProjection(projection bsonV2.M) *QueryBuilder {
qb.opts.Projection = projection
return qb
}
// SetSkip 设置查询结果的跳过数量
func (qb *QueryBuilder) SetSkip(skip int64) *QueryBuilder {
qb.opts.Skip = &skip
return qb
}
// SetPage 设置分页功能page 从 1 开始size 为每页的文档数量
func (qb *QueryBuilder) SetPage(page, size int64) *QueryBuilder {
offset := (page - 1) * size
qb.opts.Skip = &offset
qb.opts.Limit = &size
return qb
}
// AddStage 添加聚合阶段到管道
func (qb *QueryBuilder) AddStage(stage bsonV2.M) *QueryBuilder {
qb.pipeline = append(qb.pipeline, stage)
return qb
}
// BuildPipeline 返回最终的聚合管道
func (qb *QueryBuilder) BuildPipeline() []bsonV2.M {
return qb.pipeline
}
// Build 返回最终的过滤条件和查询选项
func (qb *QueryBuilder) Build() (bsonV2.M, *optionsV2.FindOptions) {
return qb.filter, qb.opts
}