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 EQUAL
NOT NOT
ELEMMATCH ELEMMATCH
OR
) )
var str = [...]string{ var str = [...]string{
@@ -67,29 +68,9 @@ func (m Operator) ToMongoOperator(k string, value interface{}) bson.M {
case EQUAL: case EQUAL:
return bson.M{k: value} return bson.M{k: value}
case NOT: case NOT:
v := value.(Filters) return bson.M{"$not": m.ToValueOperator(StringToOperator(m.String()), value)}
orList := bson.A{} case OR:
andList := bson.A{} return bson.M{"$or": m.ToValueOperator(StringToOperator(m.String()), value)}
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}
default: default:
return defaultValue return defaultValue
} }
@@ -132,9 +113,9 @@ func GetBson(filters *Filters) bson.D {
} }
func (m Operator) ToValueOperator(operator Operator, value interface{}) interface{} { func (m Operator) ToValueOperator(operator Operator, value interface{}) interface{} {
switch value.(type) { switch value := value.(type) {
case *Filters: case *Filters:
return GetBson(value.(*Filters)) return GetBson(value)
default: default:
if strings.TrimSpace(fmt.Sprintf("%v", value)) == "*" { if strings.TrimSpace(fmt.Sprintf("%v", value)) == "*" {
value = "" value = ""

View File

@@ -95,7 +95,11 @@ func (a *peerMongoAccessor) GetDefaultFilter(search string) *dbs.Filters {
} }
return &dbs.Filters{ return &dbs.Filters{
And: map[string][]dbs.Filter{ // search by name if no filters are provided And: map[string][]dbs.Filter{ // search by name if no filters are provided
"state": {{Operator: dbs.NOT.String(), Value: 1}}, "state": {{Operator: dbs.NOT.String(), Value: &dbs.Filters{
And: map[string][]dbs.Filter{
"state": {{Operator: dbs.EQUAL.String(), Value: 1}},
},
}}},
}, },
Or: map[string][]dbs.Filter{ // search by name if no filters are provided Or: map[string][]dbs.Filter{ // search by name if no filters are provided
"abstractobject.name": {{Operator: dbs.LIKE.String(), Value: search}}, "abstractobject.name": {{Operator: dbs.LIKE.String(), Value: search}},