2011-08-06 10 views
2

私は単純な検索を行うために$ regexと$ inを結合しようとしています。例えば

私はこの種のユーザーのクエリがあります:私は、キーワードフィールドを持って、各文書のための私のMongoDBのコレクションで

$user_query = "for focus red"; 

を。

{ 
    keywords : 
     [0] => ford, 
     [1] => focus, 
     [2] => red 
} 

ユーザーが間違いをして、代わりに「フォード」の「ため」と入力している見ることができるように:私は、あるフィールドのキーワード文書を取得するために取得したいです。

ユーザーがFordを入力すると$inと表示されますが、$regex$inをどのように組み合わせるかわからないので、mongodb docとphp mongo docを見ました。

+0

'$のregex'と' $のin'どのようなものですか?これらの変数の詳細を示す関連するコードを質問に追加してください。または、それがmongoのクエリの一部である場合は、そのクエリに関連するコードを表示してください。 – hakre

+5

@hakre '$ in'と' $ regex'はPHP変数ではなく、MongoDBクエリの検索演算子です。あなたは彼に自分の質問に答えるように求めています。彼は、彼はどのようにクエリを書くのか分からないと言いました。 –

答えて

4

私の迅速なスニペットがあります:

$user_query = preg_replace("/[[:blank:]]+/"," ", $user_query); 
$arr_query = explode(' ', $user_query); 

if (count($arr_query) > 1) { 
    $tmp = array(); 

    foreach ($arr_query as $q) { 
     $tmp[] = new MongoRegex("/". $q ."/"); 
    } 

    $who['keywords'] = array('$in' => $tmp); 

} else { 
    $who['keywords'] = new MongoRegex("/". $user_query ."/"); 
} 

$db->collection->find($who); 
+0

btwと書くことができるように(MongoだけでなくPHPでも)配列です。$ inを$ allに置き換えて、 – Janis

0

私はPHPとモンゴを使用していないが、私はこのように行うだろう:

//find everything inside test that was either written by someone or text contains the word "and" 
db.test.find({ $or : [ { "keywords" : { $in: ["Ford"] } } , { "keywords" : { $regex: "for.*" } } ] }) 

私はあなたが適切なPHP構造にで翻訳することができます確信している(私はモンゴシェルの構文を使用しています)。

+0

$の使用は興味深いですが、これは私の問題ではありません。質問は$ regexについてですが、ここではすべてのクエリではなく1つのキーワードに対してのみ回答しています。 – Flyingbeaver

+0

@Flyingbeaver必要な数のキーワードを追加できます。これらは '$ in:[" Ford "、" focus "、" red "]' – DrColossos