/
filter.go
executable file
·73 lines (60 loc) · 1.38 KB
/
filter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package mongodb
import (
// Packages
bson "go.mongodb.org/mongo-driver/bson"
primitive "go.mongodb.org/mongo-driver/bson/primitive"
// Namespace imports
. "github.com/mutablelogic/go-accessory"
)
///////////////////////////////////////////////////////////////////////////////
// TYPES
type filter struct {
bson.M
}
var _ Filter = (*filter)(nil)
///////////////////////////////////////////////////////////////////////////////
// LIFECYCLE
func NewFilter() *filter {
return &filter{bson.M{}}
}
///////////////////////////////////////////////////////////////////////////////
// PUBLIC METHODS
func (filter *filter) Key(v string) error {
if id, err := primitive.ObjectIDFromHex(v); err != nil {
return err
} else {
filter.M["_id"] = bson.M{"$eq": id}
}
// Return success
return nil
}
func (filter *filter) Eq(field string, v any) error {
filter.M[field] = bson.M{
"$eq": v,
}
return nil
}
func (filter *filter) Not(field string, v any) error {
filter.M[field] = bson.M{
"$ne": v,
}
return nil
}
///////////////////////////////////////////////////////////////////////////////
// PRIVATE METHODS
// and together a set of filters
func and(f ...Filter) any {
var elems bson.A
for _, f := range f {
if f != nil {
elems = append(elems, f.(*filter).M)
}
}
if len(elems) == 0 {
return bson.D{}
}
if len(elems) == 1 {
return elems[0]
}
return bson.M{"$and": elems}
}