sql >> Base de Datos >  >> NoSQL >> MongoDB

php mongodb '$ o' búsqueda de expresiones regulares

Debe especificar algunos campos para su $in :

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

Entonces funciona diciendo:si algún campo está en un rango de algunos valores

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

Editar

Es posible que aún no funcione debido al $regex incrustado . Si este es el caso, puedes probar:

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

Editar

Si alguna de esas consultas no funciona, puede hacer:

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

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

Algo así debería funcionar, de nuevo no se ha probado, pero si mi memoria no me falla, debería funcionar.

Otra edición

Esto funciona perfectamente para mí:

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

Y sale:

test1
test2
test3
tst3

Por lo tanto, no estoy seguro de qué es lo que está mal, pero recomendaría verificar dos veces que su secuencia de comandos esté dividiendo las palabras clave correctamente y que el esquema se busque correctamente emitiendo estas consultas en la consola también.

Cabe señalar que también probé esto con:

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

Y funcionó también.