Files
2026-10-27 16:44:55 +08:00

151 lines
3.8 KiB
Go

package mongos
import (
"go.mongodb.org/mongo-driver/bson"
)
type QueryBuilder struct {
query bson.M
}
func NewQueryBuilder() *QueryBuilder {
return &QueryBuilder{query: bson.M{}}
}
func (q *QueryBuilder) Build() bson.M {
return q.query
}
func (q *QueryBuilder) addCondition(condition bool, field string, value interface{}) {
if condition {
q.query[field] = value
}
}
func (q *QueryBuilder) Eq(field string, value interface{}, condition ...bool) *QueryBuilder {
if len(condition) == 0 || condition[0] {
q.query[field] = value
}
return q
}
func (q *QueryBuilder) Ne(field string, value interface{}, condition ...bool) *QueryBuilder {
if len(condition) == 0 || condition[0] {
q.query[field] = bson.M{"$ne": value}
}
return q
}
func (q *QueryBuilder) Or(conditions ...bson.M) *QueryBuilder {
if len(conditions) > 0 {
q.query["$or"] = conditions
}
return q
}
func (q *QueryBuilder) Set(value bson.M) *QueryBuilder {
q.query["$set"] = value
return q
}
func (q *QueryBuilder) Gt(field string, value interface{}, condition ...bool) *QueryBuilder {
if len(condition) == 0 || condition[0] {
q.query[field] = bson.M{"$gt": value}
}
return q
}
func (q *QueryBuilder) Gte(field string, value interface{}, condition ...bool) *QueryBuilder {
if len(condition) == 0 || condition[0] {
q.query[field] = bson.M{"$gte": value}
}
return q
}
func (q *QueryBuilder) Lt(field string, value interface{}, condition ...bool) *QueryBuilder {
if len(condition) == 0 || condition[0] {
q.query[field] = bson.M{"$lt": value}
}
return q
}
func (q *QueryBuilder) Lte(field string, value interface{}, condition ...bool) *QueryBuilder {
if len(condition) == 0 || condition[0] {
q.query[field] = bson.M{"$lte": value}
}
return q
}
func (q *QueryBuilder) In(field string, values *[]int64, condition ...bool) *QueryBuilder {
if len(condition) == 0 || condition[0] {
q.query[field] = bson.M{"$in": *values}
}
return q
}
func (q *QueryBuilder) Nin(field string, values []interface{}, condition ...bool) *QueryBuilder {
if len(condition) == 0 || condition[0] {
q.query[field] = bson.M{"$nin": values}
}
return q
}
func (q *QueryBuilder) Regex(field string, value interface{}, condition ...bool) *QueryBuilder {
if len(condition) == 0 || condition[0] {
q.query[field] = bson.M{"regex": value.(string)}
}
return q
}
func (q *QueryBuilder) All(field string, values []interface{}, condition ...bool) *QueryBuilder {
if len(condition) == 0 || condition[0] {
q.query[field] = bson.M{"$all": values}
}
return q
}
func (q *QueryBuilder) ElemMatch(field string, value interface{}, condition ...bool) *QueryBuilder {
if len(condition) == 0 || condition[0] {
q.query[field] = bson.M{"$elemMatch": value}
}
return q
}
func (q *QueryBuilder) Size(field string, value int, condition ...bool) *QueryBuilder {
if len(condition) == 0 || condition[0] {
q.query[field] = bson.M{"$size": value}
}
return q
}
func (q *QueryBuilder) Exists(field string, value bool, condition ...bool) *QueryBuilder {
if len(condition) == 0 || condition[0] {
q.query[field] = bson.M{"$exists": value}
}
return q
}
func (q *QueryBuilder) Mod(field string, divisor, remainder int, condition ...bool) *QueryBuilder {
if len(condition) == 0 || condition[0] {
q.query[field] = bson.M{"$mod": []int{divisor, remainder}}
}
return q
}
func (q *QueryBuilder) GeoWithin(field string, geometry interface{}, condition ...bool) *QueryBuilder {
if len(condition) == 0 || condition[0] {
q.query[field] = bson.M{"$geoWithin": bson.M{
"$geometry": geometry,
}}
}
return q
}
func (q *QueryBuilder) GeoIntersects(field string, geometry interface{}, condition ...bool) *QueryBuilder {
if len(condition) == 0 || condition[0] {
q.query[field] = bson.M{"$geoIntersects": bson.M{
"$geometry": geometry,
}}
}
return q
}