2011-05-14 59 views
5

我想搜索的部分姓和名的比賽 - 在SQL怎麼做或搜索

f_name LIKE J% OR l_name LIKE S% 

將匹配約翰·史密斯和約翰·亨利或哈里史密斯的例子。

我假設我可能需要使用「$或」運算符,

我有這到目前爲止,我認爲這是正確的做LIKE%的部分,但我相信它是做一個「和」搜索(這意味着它搜索f_name LIKEĴ%和l_name LIKE S%,因此將只匹配約翰·史密斯):

$name1="J"; 
$name2="S"; 
$cursor = $this->clientCollection->find(array('f_name' => new MongoRegex('/^'.$name1.'/i'), 'l_name' => new MongoRegex('/^'.$name2.'/i'))); 

注:這將匹配包含如引用%j%

MongoRegex('/'.$name1.'/i') 

這將比賽開始(注意加^)作爲以J%

MongoRegex('/^'.$name1.'/i') 

回答

2

$or採取條款的數組,所以你基本上只需要環繞你的當前查詢另一個數組:

array('$or' => array(
    array('f_name' => new MongoRegex('/'.$name1.'/i')), 
    array('l_name' => new MongoRegex('/'.$name2.'/i')) 
)); 

編輯:前面的例子錯過了內線電話array()

原來,錯了,例如我貼這個樣子:

array('$or' => array(
    'f_name' => new MongoRegex('/'.$name1.'/i'), 
    'l_name' => new MongoRegex('/'.$name2.'/i') 
)); 

這是一個有效的查詢,但不是一個有用的一個。本質上,f_namel_name查詢部分仍然是在一起,所以$or部分是無用的(它只能通過一個查詢,所以它只是單獨運行該查詢)。

至於您在評論中提到的替代方案,該方法無效,因爲查詢中最外面的數組必須是關聯數組。混淆的出現是因爲Mongo的查詢語法類似於JSON,並且使用了對象和數組的混合體,但是這兩種結構都是由PHP中的數組表示的。 PHP Mongo驅動程序基本上將PHP關聯數組轉換爲JSON對象({ ... }),將「正常」PHP數組轉換爲JSON數組([ ... ])。

實際的結果是「正常的」PHP數組通常只在關聯數組內部有效,例如爲字段指定多個值時。從PHP Mongo manual下面的例子顯示了一個「正常」的數組中查詢的有效使用:

$cursor = $collection->find(array("awards" => array('$in' => array("gold", "copper")))); 
+0

這工作,但我只是想知道,爲什麼內部的一組陣列通話?原始代碼起作用,它將記錄返回爲AND。我嘗試使用更改代碼\t $ cursor = $ this-> clientCollection-> find(array('f_name'=> new MongoRegex('/'.$ name1。'/ i')),array('l_name '=> new MongoRegex('/'.$ name2。'/ i'))));並且它不起作用,但它在您的情況下使用'$或'。 – 2011-05-14 10:06:45

+0

我試圖解釋這裏發生了什麼。不幸的是,所有這些PHP'array()'都可以很難說出PHP中的Mongo查詢中發生了什麼,特別是一目瞭然。 – 2011-05-14 21:55:45