sql >> データベース >  >> NoSQL >> MongoDB

phpmongodb'$または'正規表現検索

    $inにいくつかのフィールドを指定する必要があります :

    $who=array('$or' => array(
        array('somefield' => array('$in' => array(new MongoRegex($title)))),
        array('otherotherfield' => array('$in' => array(new MongoRegex($tags))))
    ));
    

    したがって、次のように言うことで機能します:あるフィールドがいくつかの値の範囲内にある場合

    http://docs.mongodb.org/manual/reference/operator/in/

    編集

    $regexが埋め込まれているため、それでも機能しない可能性があります 。この場合は、次のことを試すことができます:

    $who=array('$or' => array(
        array('somefield' => new MongoRegex($title)),
        array('otherotherfield' => new MongoRegex($tags))
    ));
    

    編集

    これらのクエリのいずれかが機能しない場合は、次のことができます。

    $who = array('$or' => array());
    
    foreach($arr_query as $q){
        $who['$or'][] = array('title' => new MongoRegex("/^$q/"));
        $who['$or'][] = array('tags' => new MongoRegex("/^$q/"));
    }
    

    そのようなものはうまくいくはずです、これもテストされていませんが、私の記憶が私に正しく役立つなら、それはそれをするはずです。

    別の編集

    これは私にとって完璧に機能します:

    $mongo = new Mongo();
    $db = $mongo->tstvid;
    $videos = $db->videos;
    
    $videos->insert(array('title' => 'test1', 'tags' => array('h','h')));
    $videos->insert(array('title' => 'test2', 'tags' => array('h','h')));
    $videos->insert(array('title' => 'test3', 'tags' => array('h','h')));
    $videos->insert(array('title' => 'tst3', 'tags' => array('h','test')));
    
    $user_query = preg_replace("/[[:blank:]]+/"," ", "test");
    $arr_query = explode(' ', $user_query);
    
    if (count($arr_query) > 1) {
    
        $who = array(
            '$or' => array()        
        );
    
        foreach ($arr_query as $q) {
            $who['$or'][] = array('title' => new MongoRegex("/^". $q ."/i"));
            $who['$or'][] = array('title' => new MongoRegex("/^". $q ."/i"));
        }
    
    } else {
        $regex=new MongoRegex("/^". $user_query ."/i");
        $tregex=new MongoRegex("/^". $user_query ."/i");
        $who=array(
                    '$or' => array(
                        array('title' => $regex),
                        array('tags' => $tregex)
                        )
                );
    }
    
    $vids=$videos->find($who);
    $results="";
    $i=0;
    foreach($vids as $vid){
        $results .= "<li>".$vid['title']."</li>\n";
        $i++;
    }
    if($i==0){
        $results="<em>No results found</em>";
    }
    
    echo $results;
    

    そしてそれは出力します:

    test1
    test2
    test3
    tst3
    

    したがって、何が問題なのかはわかりませんが、スクリプトがキーワードを正しく分割しており、コンソールでもこれらのクエリを発行してスキーマが正しく検索されていることを再確認することをお勧めします。

    私もこれを試したことに注意してください:

    $user_query = preg_replace("/[[:blank:]]+/"," ", "test h");
    

    そしてそれもうまくいきました。



    1. $projectionと$elemMatch

    2. インデックスmongoを確認しながら、開いているファイルが多すぎます

    3. MongoDBクエリ、userIDですべて検索

    4. 距離が可変のMongoDbニア/ジオニアクエリ