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 }