@@ -0,0 +1,150 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user