获取一个字符串作为输入(来自用户搜索),我正在尝试为bson.M
构建一个mgo
对象来搜索mongo数据库并找到x个项目。
像这样的东西
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
}
我需要的搜索基于
title
必须在某处包含q
中的每个字词。例如,如果存储的数据看起来像{title: "abcde"}
,那么
Abc
将匹配de Bc
将匹配ac
将不匹配我终于明白了。神奇的部分看起来像这样:
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}
答案 0 :(得分:2)
mongo过滤器可以使用正则表达式,例如;
bson.M{"title": bson.M{"$regex": bson.RegEx{Pattern: title, Options: "i"}}}
所以在这种情况下,标题变量会是这样的; .*abc*.
。选项:" i"使案例不敏感。
至于匹配子字符串(方案2)我不知道如何在正则表达式中实现。
答案 1 :(得分:0)
简单地使用它,
wordOffset := q
selector:= bson.M{"title": bson.M{"$regex": wordOffset}}