sql >> Database >  >> NoSQL >> MongoDB

php mongodb '$or' regex zoeken

U moet enkele velden specificeren voor uw $in :

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

Het werkt dus door te zeggen:als een veld in een bereik van enkele waarden ligt

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

Bewerken

Dat werkt misschien nog steeds niet vanwege de ingesloten $regex . Als dit het geval is, kunt u het volgende proberen:

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

Bewerken

Als een van deze zoekopdrachten niet werkt, kunt u het volgende doen:

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

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

Zoiets zou moeten werken, nogmaals, het is niet getest, maar als mijn geheugen me goed van dienst is, zou dat het moeten doen.

Nog een bewerking

Dit werkt perfect voor mij:

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

En het geeft uit:

test1
test2
test3
tst3

Dus ik weet niet zeker wat er mis is, maar ik raad je aan om te controleren of je script de zoekwoorden goed opsplitst en dat het schema goed wordt doorzocht door deze zoekopdrachten ook in de console uit te voeren.

Opgemerkt moet worden dat ik dit ook heb geprobeerd met:

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

En het werkte ook.



  1. Een SQL LIKE-instructie gebruiken in MongoDB

  2. Hoe indexeer je in MongoDB een ingesloten objectveld in een array?

  3. Wat is de juiste manier om mangoestverbindingen met express.js af te handelen?

  4. Gegevens initialiseren op gedockte mongo