Bạn cần chỉ định một số trường cho $in
của mình :
$who=array('$or' => array(
array('somefield' => array('$in' => array(new MongoRegex($title)))),
array('otherotherfield' => array('$in' => array(new MongoRegex($tags))))
));
Vì vậy, nó hoạt động bằng cách nói: nếu một số trường nằm trong một số giá trị
http://docs.mongodb.org/manual/reference/operator/in/
Chỉnh sửa
Điều đó vẫn có thể không hoạt động do $regex
được nhúng . Nếu đúng như vậy thì bạn có thể thử:
$who=array('$or' => array(
array('somefield' => new MongoRegex($title)),
array('otherotherfield' => new MongoRegex($tags))
));
Chỉnh sửa
Nếu một trong hai truy vấn đó không hoạt động, bạn có thể thực hiện:
$who = array('$or' => array());
foreach($arr_query as $q){
$who['$or'][] = array('title' => new MongoRegex("/^$q/"));
$who['$or'][] = array('tags' => new MongoRegex("/^$q/"));
}
Một cái gì đó như vậy sẽ hoạt động, một lần nữa nó chưa được kiểm tra nhưng nếu trí nhớ của tôi phục vụ tôi đúng, điều đó nên làm.
Một chỉnh sửa khác
Điều này hoàn toàn phù hợp với tôi:
$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;
Và kết quả là:
test1
test2
test3
tst3
Vì vậy, tôi không chắc điều gì đã xảy ra nhưng tôi khuyên bạn nên kiểm tra kỹ tập lệnh của mình có chia đúng các từ khóa hay không và lược đồ đang được tìm kiếm đúng bằng cách đưa ra các truy vấn này trong bảng điều khiển.
Cần lưu ý rằng tôi cũng đã thử điều này với:
$user_query = preg_replace("/[[:blank:]]+/"," ", "test h");
Và nó cũng hoạt động tốt.