用户搜索Golang mgo

时间:2017-03-13 18:58:15

标签: mongodb go mgo

获取一个字符串作为输入(来自用户搜索),我正在尝试为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
}

我需要的搜索基于

  • 忽略大小写(我发现this answer让我参与其中)
  • 存储数据中的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}

2 个答案:

答案 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}}