【问题标题】:php mongodb '$or' regex searchphp mongodb '$or' 正则表达式搜索
【发布时间】:2012-12-11 00:31:35
【问题描述】:

我正在尝试查询 mongodb“视频”集合以通过“标题”或“标签”字段查找结果......即使我搜索我知道在标题和/或标签中的术语,它也会不断返回 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);
?>

【问题讨论】:

  • 我不会,如果它是故意的,但在 '$or' $or 不会被读取为变量

标签: php regex mongodb


【解决方案1】:

您需要为您的$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");

而且效果也很好。

【讨论】:

  • @b747fp 是的,我认为这是因为您不能将 $regex 嵌套在 $in 中,我认为您不能,但我无法在这里进行测试。您很可能需要重写查询以删除 $in。由于您的查询只为每个字段寻找一个值,您可能只需取出 $in
  • @b747fp 它也是 Mongo 正则表达式对象,这里是一秒钟
  • 它不是在为每个字段寻找 1 个值,而是在寻找一个值数组(每个单词与 $_GET['q'] 分开)
  • @b747fp 如果我的编辑不起作用(编辑了对 mongo 正则表达式对象的第一个查询),那么您可以为每个条件构建一个大的 $​​or 来检查数组中的值。
  • 我也试过了。这也返回 0 个结果 pastebin.com/raw.php?i=M4tRuNiF
【解决方案2】:
$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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 2011-02-21
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    相关资源
    最近更新 更多