151 lines
3.8 KiB
Go
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
|
|
}
|