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.