Reputation:
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
title
in the stored data must, somewhere, include each of the words in the q
.So for instance if the stored data looks like {title: "abcde"}
, then
Abc
will matchde Bc
will matchac
will not matchI 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}
Upvotes: 1
Views: 1959
Reputation: 611
Simple use this,
wordOffset := q
selector:= bson.M{"title": bson.M{"$regex": wordOffset}}
Upvotes: 0
Reputation: 469
The mongo filter can take regex, for example;
bson.M{"title": bson.M{"$regex": bson.RegEx{Pattern: title, Options: "i"}}}
So in this case the title variable would be something like; .*abc*.
. The Options: "i" enables case insensitivity.
As for matching the substring (scenario 2) I am not sure how to achieve within regex.
Upvotes: 1