MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

tìm kiếm php mongodb '$ hoặc' regex

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. 8 cách để bắt đầu một ngày trong MongoDB

  2. Meteor mongodb $ inc với bản cập nhật

  3. Không muốn bắt đầu mongod bằng `sudo mongod`

  4. mảng với các giá trị duy nhất trên tất cả các tài liệu của một bộ sưu tập

  5. Sự khác biệt của mongoose và mongoJS là gì? Tôi nên sử dụng cái nào?