Mongo Improvment for filtering

This commit is contained in:
mr
2026-01-27 10:59:38 +01:00
parent d772a703da
commit 9b4f9e420a
2 changed files with 11 additions and 26 deletions

View File

@@ -21,6 +21,7 @@ const (
EQUAL
NOT
ELEMMATCH
OR
)
var str = [...]string{
@@ -67,29 +68,9 @@ func (m Operator) ToMongoOperator(k string, value interface{}) bson.M {
case EQUAL:
return bson.M{k: value}
case NOT:
v := value.(Filters)
orList := bson.A{}
andList := bson.A{}
f := bson.D{}
for k, filter := range v.Or {
for _, ff := range filter {
orList = append(orList, StringToOperator(ff.Operator).ToMongoOperator(k, ff.Value))
}
}
for k, filter := range v.And {
for _, ff := range filter {
andList = append(andList, StringToOperator(ff.Operator).ToMongoOperator(k, ff.Value))
}
}
if len(orList) > 0 && len(andList) == 0 {
f = bson.D{{"$or", orList}}
} else {
if len(orList) > 0 {
andList = append(andList, bson.M{"$or": orList})
}
f = bson.D{{"$and", andList}}
}
return bson.M{"$not": f}
return bson.M{"$not": m.ToValueOperator(StringToOperator(m.String()), value)}
case OR:
return bson.M{"$or": m.ToValueOperator(StringToOperator(m.String()), value)}
default:
return defaultValue
}
@@ -132,9 +113,9 @@ func GetBson(filters *Filters) bson.D {
}
func (m Operator) ToValueOperator(operator Operator, value interface{}) interface{} {
switch value.(type) {
switch value := value.(type) {
case *Filters:
return GetBson(value.(*Filters))
return GetBson(value)
default:
if strings.TrimSpace(fmt.Sprintf("%v", value)) == "*" {
value = ""