MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

php mongodb '$or' Regex-Suche

Sie müssen einige Felder für Ihren $in angeben :

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

Es funktioniert also, indem man sagt:wenn ein Feld in einem Bereich einiger Werte liegt

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

Bearbeiten

Das funktioniert möglicherweise wegen des eingebetteten $regex immer noch nicht . Wenn dies der Fall ist, können Sie Folgendes versuchen:

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

Bearbeiten

Wenn eine dieser Abfragen nicht funktioniert, können Sie Folgendes tun:

$who = array('$or' => array());

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

So etwas sollte funktionieren, wieder ist es ungetestet, aber wenn ich mich recht erinnere, sollte das reichen.

Eine weitere Bearbeitung

Das funktioniert perfekt für mich:

$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;

Und es gibt aus:

test1
test2
test3
tst3

Ich bin mir also nicht sicher, was falsch ist, aber ich würde empfehlen, zu überprüfen, ob Ihr Skript die Schlüsselwörter richtig aufteilt und das Schema richtig durchsucht wird, indem diese Abfragen auch in der Konsole ausgegeben werden.

Es sei darauf hingewiesen, dass ich dies auch mit versucht habe:

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

Und es hat auch funktioniert.