2017-01-04 4 views
0

RoboMongo에서 이와 같이 보이는 값의 중첩 배열이 있습니다.MongoDB의 모든 콜렉션 배열을 통해 검색

enter image description here

또는이 조금 더 명확 수 있습니다;

enter image description here

(한 쿼리에서) 정규식 모든 키/값 쌍을 검색 할 수있는 하나의 방법이 있습니까? 스크립트는 얼마나 많은 customField 키/값 쌍이 있는지 알 수 없습니다!

지금까지 PHP를 사용하고 있습니다. 다른 사람을 잘 최초의 키/값 쌍 작업 ..하지만되지

['poco.customFields.0.value' => ['$regex' => '.*'.$query.'.*', '$options' => 'i']],

내가 어떻게 해야할지하지 않는 두 개의 쿼리를 수행하거나 더 이상 없을 것이라고 추측하지 않고 말하자면, 100을 뛰어 넘기 만하면됩니다.

+0

나는 $로 할 수 있지만 php 구문을 잘 모르겠다. 배열에서 키 - 값 쌍을 반복 할 수있는 자바 스크립트 함수를 전달할 수있는 $를 확인할 수있다. –

+0

예상되는 결과는 무엇입니까? 질문에 추가 할 수 있습니까? – dikesh

답변

0

특정 정규 표현식과 일치하는 customFields의 내용을 가진 문서를 얻으 려한다고 가정 할 때, 내가 생각할 수있는 두 가지 해석이 있습니다.

(1) 패턴 매칭 customFields에 적어도 하나 값으로 모든 문서를 반환 :

:

[ 'customFields.value' => [ '$regex' => $pattern, '$options' => 'i' ]] 

(2) 패턴 매칭 customFields에 모든 값으로 모든 문서를 반환을

[ 'customFields.value' => [ '$not' => new MongoDB\BSON\Regex('\b^(?!'.$pattern.').+', 'i') ]] 

첫 번째 쿼리는 자체적으로 설명됩니다. customFields 배열의 모든 요소를 ​​반복하고 각각에 대해 정규식 검사를 수행합니다. 적어도 하나의 요소가 패턴과 일치하면 상위 문서가 반환됩니다.

두 번째 것은 좀 더 정교합니다. "모든 요소 경기 특정 패턴이 곳"에 해당합니다 요구 사항 "여기서 단일 요소 특정 패턴과 일치하지 않습니다." 이중 부정을 달성하기 위해 우리는 이전에 사용한 것과 같은 쿼리에 부정적인 lookahead를 적용하여 생성 된 역 정규 표현식과 함께 $not을 사용합니다. $not은 문자열 수락을 거부하기 때문에 MongoDB\BSON\Regex 클래스의 인스턴스를 사용하여 즉각적인 정규 표현식을 생성합니다.

부정적 미리보기에 대한 자세한 내용은 here을 참조하십시오.

+0

놀랍습니다. 몇 가지 테스트를했는데 제대로 작동하는 것 같습니다. 나는 쿼리가 단지 에러를 일으키지 않고 배열을 반복하는 것을 알 것이라고 생각하지 못했다. – mikelovelyuk

+0

@mikelovelyuk 매우 도움이 되었기 때문에 기쁩니다. 문제가 완전히 해결 된 경우 대답을 승인 된 것으로 표시하거나 문제가있을 경우 명확히하려는 추가 세부 정보를 추가하십시오. – Imperator

관련 문제