Getting a string as input (from a user search), I am trying to construct a bson.M
object for mgo
to search through the mongo database and find x number of items.
Something like this
func Search (w http.ResponseWriter, r *http.Request) {
q := r.FormValue("q")
filter := bson.M{}
// magic happens here
// do db connection stuff
things := []*thing{}
err := db.Find(&filter).Limit(10).All(&things)
// check error, send things, etc
}
What I need the search to be based on is
- ignore case (I found this answer which takes me part of the way)
- the
title
in the stored data must, somewhere, include each of the words in theq
.
So for instance if the stored data looks like {title: "abcde"}
, then
-
Abc
will match -
de Bc
will match -
ac
will not match
Edit: Solution
I finally figured it out. The magic part looks like this:
q := r.FormValue("q")
qs := strings.Split(q, " ")
and := make([]bson.M, len(qs))
for i, q := range qs {
and[i] = bson.M{"title": bson.M{
"$regex": bson.RegEx{Pattern: ".*" + q + ".*", Options: "i"},
}}
}
filter := bson.M{"$and": and}