50 lines
1020 B
Go
50 lines
1020 B
Go
|
package mongoext
|
||
|
|
||
|
import (
|
||
|
"go.mongodb.org/mongo-driver/bson"
|
||
|
"go.mongodb.org/mongo-driver/mongo"
|
||
|
)
|
||
|
|
||
|
// FixTextSearchPipeline moves {$match:{$text:{$search}}} entries to the front of the pipeline (otherwise its an mongo error)
|
||
|
func FixTextSearchPipeline(pipeline mongo.Pipeline) mongo.Pipeline {
|
||
|
|
||
|
dget := func(v bson.D, k string) (bson.M, bool) {
|
||
|
for _, e := range v {
|
||
|
if e.Key == k {
|
||
|
if mv, ok := e.Value.(bson.M); ok {
|
||
|
return mv, true
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return nil, false
|
||
|
}
|
||
|
mget := func(v bson.M, k string) (bson.M, bool) {
|
||
|
for ekey, eval := range v {
|
||
|
if ekey == k {
|
||
|
if mv, ok := eval.(bson.M); ok {
|
||
|
return mv, true
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return nil, false
|
||
|
}
|
||
|
|
||
|
result := make([]bson.D, 0, len(pipeline))
|
||
|
|
||
|
for _, entry := range pipeline {
|
||
|
|
||
|
if v0, ok := dget(entry, "$match"); ok {
|
||
|
if v1, ok := mget(v0, "$text"); ok {
|
||
|
if _, ok := v1["$search"]; ok {
|
||
|
result = append([]bson.D{entry}, result...)
|
||
|
continue
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
result = append(result, entry)
|
||
|
}
|
||
|
|
||
|
return result
|
||
|
}
|