sql >> Database teknologi >  >> NoSQL >> MongoDB

php mongodb '$or' regex-søgning

Du skal angive nogle felter for din $in :

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

Så det virker ved at sige:hvis et eller andet felt er i et område med nogle værdier

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

Rediger

Det virker muligvis stadig ikke på grund af den indlejrede $regex . Hvis dette er tilfældet, kan du prøve:

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

Rediger

Hvis en af ​​disse forespørgsler ikke virker, kan du gøre:

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

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

Sådan noget burde virke, igen er det uafprøvet, men hvis min hukommelse hjælper mig rigtigt, burde det gøre det.

En anden redigering

Dette fungerer perfekt for mig:

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

Og det udsender:

test1
test2
test3
tst3

Så jeg er usikker på, hvad der er galt, men jeg vil anbefale, at du dobbelttjekker, at dit script opdeler nøgleordene rigtigt, og skemaet søges rigtigt ved også at udstede disse forespørgsler i konsollen.

Det skal bemærkes, at jeg også prøvede dette med:

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

Og det virkede også.



  1. Synker emnedata fra Java-producent til Mongodb

  2. Rubin/skinner:mongoid med mongo(perle); en bson konflikt? Hvordan håndterer man forskellige versioner?

  3. MongoDB:Er læsninger/skrivninger til databasen samtidige?

  4. Hvordan opsætter du Mongo-replikasæt på Kubernetes?