2012-05-08 2 views
1

단순한 데이터베이스가 있고 영어와 스페인어 및/또는 영어와 프랑스어 (스페인어와 프랑스어는 말할 수 없음)를 사용하는 모든 사용자를 찾으려고합니다. 나는 이런 식으로 검색 할 때

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

내가 예상 결과를 얻을 : I는 다음과 같이 설정 기록의 소수와 users 테이블이

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

셸 쿼리 예제가 테스트 데이터에 대한 예상 결과를 반환했을 수도 있지만 쿼리 개체에서 $all 속성을 파손하고 있기 때문에 기술적으로 올바르지 않습니다. 최상위 $or 연산자를 사용하여, 올바른 쿼리 될 것이다 :

$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의로 해석

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

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" ] } 

존, 프레드와 루크가 반환됩니다.

+0

고마워요! 그건 완벽하게 작동합니다. – misterculture