sql >> Databasteknik >  >> NoSQL >> MongoDB

php mongodb '$or' regex-sökning

Du måste ange några fält för din $in :

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

Så det fungerar genom att säga:om något fält är inom ett område med vissa värden

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

Redigera

Det kanske fortfarande inte fungerar på grund av den inbäddade $regex . Om så är fallet kan du prova:

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

Redigera

Om någon av dessa frågor inte fungerar kan du göra:

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

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

Något sådant borde fungera, återigen är det oprövat, men om mitt minne stämmer borde det göra det.

Ännu en redigering

Detta fungerar perfekt för 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;

Och den ger ut:

test1
test2
test3
tst3

Så jag är osäker på vad som är fel men jag skulle rekommendera att dubbelkolla att ditt skript bryter upp nyckelorden på rätt sätt och schemat söks rätt genom att även skicka dessa frågor i konsolen.

Det bör noteras att jag också provade detta med:

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

Och det fungerade också.



  1. Släpp en Mongo-databassamling i Meteor

  2. Ta bort ett objekt från en kapslad array med $pull och $[identifier] (mongoDB 3.6)

  3. åtkomst till mongodbs objekt från mapper (MapReduce)

  4. i React kallar jag två listor till sida från mongo och jag vill klicka på en för att filtrera vad som visas i andra