2012-05-08 22 views
1

假設我有一個簡單的數據庫,並且正在嘗試查找所有同時使用英語和西班牙語以及/或者英語和法語(但不是西班牙語和法語)的用戶。我有一個users表的記錄屈指可數設置是這樣的:

{ 
    "username": "jdoe", 
    "languages": ["english", "spanish", "french"] 
} 

我得到預期的結果,當我搜索這樣的:

db.find({ "languages" : { $all:['english', 'spanish'], $all:['english', 'french'] } }) 

但我不知道該怎麼辦呢與蛋糕。我可以匹配一個語言對像這樣:

$this->User->find('all', array('conditions' => 'User.languages' => array('$all' => array('english', 'spanish')))); 

但我被困在如何搜索多個對;一個數組的數組似乎沒有做到這一點。

這是一個別人開始的項目,所以我並不是特別熟悉CakePHP或MongoDB的細微差別;我有一種感覺,我忽略了一些明顯的東西。有任何想法嗎?

回答

4

您的shell查詢示例可能已經爲您的測試數據返回了預期結果,但它在技術上不正確,因爲您正在查詢對象中打開$all屬性。使用頂層$or操作,正確的查詢將是:

db.users.find({"$or": [ 
    {"languages": {"$all": ["english", "spanish"]}}, 
    {"languages": {"$all": ["english", "french"]}} 
]}); 

這轉化爲CakePHP的爲:

$results = $this->User->find('all', array('conditions' => array(
    '$or' => array(
     array('User.languages' => array('$all' => array('english', 'spanish'))), 
     array('User.languages' => array('$all' => array('english', 'french'))), 
    ), 
))); 

我測試這使用在以下夾具數據(沒有_id的) CakePHP應用程序:

{ "username" : "john", "languages" : [ "english", "spanish", "french" ] } 
{ "username" : "mike", "languages" : [ "spanish", "french" ] } 
{ "username" : "bill", "languages" : [ "english" ] } 
{ "username" : "fred", "languages" : [ "english", "french" ] } 
{ "username" : "luke", "languages" : [ "english", "spanish" ] } 

John,Fred和Luke被返回。

+0

謝謝!這是完美的。 – misterculture