Я пытаюсь запросить коллекцию «видео» mongodb, чтобы найти результаты по полям «title» или «tags» … он сохраняет возвращаемые 0 результатов, даже когда я ищу термины, которые я знаю, в заголовке и / или тегах … любая помощь будет оценена
<?php $user_query = preg_replace("/[[:blank:]]+/"," ", $_GET['q']); $arr_query = explode(' ', $user_query); foreach ($arr_query as $q) { $title[] = '/'. $q .'/i'; $tags[] = '/'. $q .'/i'; } $who=array( '$or' => array( array('$in' => array('$regex' => $title)), array('$in' => array('$regex' => $tags)) ) ); $vids=$videos->find($who); ?>
Вам нужно указать некоторые поля для вашего $in
:
$who=array('$or' => array( array('somefield' => array('$in' => array(new MongoRegex($title)))), array('otherotherfield' => array('$in' => array(new MongoRegex($tags)))) ));
Так оно работает, говоря, говоря: если какое-то поле находится в диапазоне некоторых значений
http://docs.mongodb.org/manual/reference/operator/in/
Это может все еще не работать из-за встроенного $regex
. Если это так, вы можете попробовать:
$who=array('$or' => array( array('somefield' => new MongoRegex($title)), array('otherotherfield' => new MongoRegex($tags)) ));
Если любой из этих запросов не работает, вы можете:
$who = array('$or' => array()); foreach($arr_query as $q){ $who['$or'][] = array('title' => new MongoRegex("/^$q/")); $who['$or'][] = array('tags' => new MongoRegex("/^$q/")); }
Что-то вроде этого должно работать, опять же оно непроверено, но если моя память служит мне правильной, она должна это делать.
Это отлично работает для меня:
$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;
И он выводит:
test1 test2 test3 tst3
Поэтому я не уверен, что не так, но я бы рекомендовал дважды проверить, что ваш скрипт разбивает ключевые слова правильно, а схема просматривается правильно, вызывая эти запросы в консоли.
Следует отметить, что я также пробовал это:
$user_query = preg_replace("/[[:blank:]]+/"," ", "test h");
И это сработало.
$search_string = preg_replace("/[^A-Za-z0-9]/", " ", $_GET['q']); $search_string = $search_string; //Connecting mongoDB $dbhost = 'localhost'; $dbname = 'yourdbname'; $port = '27017'; $m = new MongoClient(); $db = $m->$dbname; if($m){ // select a collection $videos = $db->videos; // search for title and tags $searchQuery = array( '$or' => array( array( 'title' => array( '$regex' => $search_string, ), ), array( 'tags' => array( '$regex' => $search_string, ), ), ) ); $cursor = $videos->find($searchQuery); foreach ($cursor as $doc) { var_dump($doc); //or what ever you want //var_dump($doc['title']); } else{ echo "Collection videos cant select :( <br>";die(); }
Думает, что это поможет. : D