2014-10-07 4 views
2

내 synfony 2 프로젝트에서 쿼리 빌더를 사용하여 검색 결과를 필터링하고 있습니다. 내 MongoDB에는 배열에 몇 가지 값이 있습니다.ODM Query Builder : "in in"연산자 또는 이와 동등한 연산이 있습니까?

Query Bulider에는 배열의 여러 값 중 하나와 같은 값을 쿼리 할 수있는 "in"연산자가 있습니다. 나는 반대 값 연산을 수행하기를 원했다. 즉, 하나의 값이 주어지면 배열을 포함하는 데이터베이스의 엔트리에 대한 쿼리가 내 값을 포함하고 싶다.

{ 
    "_id": 123, 
    "name": "John", 
    "countries_visited": 
    [ 
    "Australia" 
    "Bulgaria", 
    "Canada" 
    ] 
} 

내가 "캐나다"를 방문한 사람에 대한 내 데이터베이스를 조회 할 : 예를 들어

, 나는 내 MongoDB의에서이 항목을 말한다. 지금은 where 속성을 다음과 같이 사용하고 있지만 더 좋은 방법을 찾고 있습니다.

 $qb->field('countries_visited')->where("function(){ 
      return this.indexOf(".$countryName.") > -1 
     }"); 

편집 : 가 innotIn 오퍼레이터 파라미터로 배열 MongoDB를 수신하고 단일 값과 비교한다. 하나의 매개 변수를 제공하고 그것을 MongoDB의 배열 필드에 적용 할 필요가 있습니다. 그런 일이 있으면 contains 연산자가 필요합니다.

+0

나는'notIn은()': –

+0

아니, 읽어 보시기 바랍니다 후에 당신이있어 어떤 것이라고 생각했을 것이다 전체 설명이 제목이 아니라 처음입니다. – ecc

+0

나는 그것을했고 그것을 이해하지 못한다. –

답변

2

흥미로운 점은 MongoDB가 자동으로 처리한다는 것입니다. 배열 필드에 대해 단일 값을 질의하는 경우 Mongo는 배열에 값이 포함되어 있는지 확인하려고합니다.

docs에서 촬영 :

일치 요소

평등이 일치하는 배열의 단일 요소를 지정할 수 있습니다 일치하는 배열입니다. 이 스펙은 배열에 지정된 값이있는 요소가 하나 이상 포함되어 있으면 일치합니다.

그래서 당신은 할 수 있어야

$users = $dm->getRepository('User')->findOneBy([ 
    'countries_visited' => 'Canada' 
]); 

또는

$qb->field('countries_visited')->equals('Canada'); 
+0

동일 연산자가 배열로 작동합니까? 시도하고 결과를 다시 가져올 것입니다. 감사. – ecc

+1

완전히 그렇습니다. 부수적으로 이것은 배열을 한 레벨 씩 이동시킬 뿐이며 배열 내부의 배열에서는 작동하지 않습니다. – ecc