我正在尝试查询mongodb“videos”集合以通过“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);
?>
答案 0 :(得分:0)
您需要为$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");
它也有效。
答案 1 :(得分:0)
$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