2017-03-13 17 views
0

文字列を入力として(ユーザー検索から)、mgobson.Mオブジェクトを作成して、mongoデータベースを検索し、x個の項目を検索しようとしています。Golang mgoでユーザーを検索

私は検索がに基づいてする必要がどのようなこの

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の各単語を含まなければならない。

  • Abc
  • de Bcが一致すると一致しますので、格納されたデータは、その後、{title: "abcde"}のように見える場合、たとえば
  • 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} 

答えて

1

mongoフィルタは、たとえば正規表現をとることができます。

 bson.M{"title": bson.M{"$regex": bson.RegEx{Pattern: title, Options: "i"}}} 

この場合、タイトル変数は次のようになります。 .*abc*.。オプション: "i"は大文字と小文字を区別しません。

部分文字列(シナリオ2)のマッチングについては、正規表現内でどのように達成するかはわかりません。

+0

ありがとうございます! - 'Pattern:title'?あなたは 'パターン:q'を意味しますか?そして 'q 'が複数の単語で構成されている場合、どうやってやるのか分かりますか? –

+0

はい、しかし、関連する正規表現を追加する必要があります。あなたがNoSqlインジェクションスタイルの攻撃にさらされていないことを確認するために、エスケープ/入力の検証をお勧めします。 – Steve101

+0

複数の単語について私はあなたが文字列分割のいくつかの並べ替えを行うことができますし、正規表現をチェーンする$とキーワードを使用して想像するだろう。 (https://docs.mongodb.com/manual/reference/operator/query/and/) – Steve101

関連する問題