From 9b4f9e420aab24e0a26e543bd3fb53b6d6fd8818 Mon Sep 17 00:00:00 2001 From: mr Date: Tue, 27 Jan 2026 10:59:38 +0100 Subject: [PATCH] Mongo Improvment for filtering --- dbs/dbs.go | 31 ++++++------------------------ models/peer/peer_mongo_accessor.go | 6 +++++- 2 files changed, 11 insertions(+), 26 deletions(-) diff --git a/dbs/dbs.go b/dbs/dbs.go index 36bcc83..a548ea6 100644 --- a/dbs/dbs.go +++ b/dbs/dbs.go @@ -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 = "" diff --git a/models/peer/peer_mongo_accessor.go b/models/peer/peer_mongo_accessor.go index 3eda04b..4804356 100644 --- a/models/peer/peer_mongo_accessor.go +++ b/models/peer/peer_mongo_accessor.go @@ -95,7 +95,11 @@ func (a *peerMongoAccessor) GetDefaultFilter(search string) *dbs.Filters { } return &dbs.Filters{ 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 "abstractobject.name": {{Operator: dbs.LIKE.String(), Value: search}},