2016-07-25 6 views
1

색인으로 이름을 사용하는 문서가 들어있는 거대한 mongoDB가 있습니다.MongoDB 개수와 정규식 검색 개수가 일치하지 않습니다.

기본적으로 48000 016 개 항목이 포함 된 텍스트 파일이 있습니다. (나는 카운트를 얻기 위해 wc -l을 사용한다)

OCR에서 추출한 이름 (많은 정크)과 다른 언어 (일본어, 러시아어 등).

내 MongoDB 테이블 통계에 내가 48 000 016을 사용한다고 표시됩니다.

나는이 정규식 사용 (표준 문자열 인) 이름의 항목을 조회 할 때문에 문제가 발생

:

/^([A-Z]|\W|\s|\d|_)/i 

그래서 내 체크리스트 :

  • 어떤 편지 -
  • 을 확인을
  • 대/소문자 구분 안 함 - 체크
  • 숫자 - 확인
  • 밑줄 - 확인
  • \ W는 숫자, 문자 또는 밑줄이 아닌 문자입니다.

그래서이 정규식으로 문자열 값에 대해 데이터베이스를 쿼리하므로이 정규식에서 모든 것을 얻어야합니다. 그러나 문제는 5 개의 항목이 누락되었습니다.

쿼리 결과를 계산할 때 48 000 011 항목이 있습니다.

5 가지 아이디어가있을 수 있습니다. 내 문제의 본질 때문에 간단하게 커서를 사용하여 모든 항목을 살펴볼 수 있습니다. 그렇게 할 수는 있지만 모든 값을 검색 할 수있는 정규식이 필요합니다.

주석에 표시된대로 데이터베이스에서이 쿼리를 실행했습니다.

db.name.aggregate({$group:{_id:"uniqueDocs", count:{$sum:1}}}) 

결과는 다음과 같습니다

{ "result" : [ ], "ok" : 1 } 

고마워요!

+0

정규식을 반전하고 결과를 확인하는 방법은 어떻습니까? –

+0

실행하여'db. .aggregate ({$ group : {_ id : "uniqueDocs", count : {$ sum : 1}}})'을 실행하여 [편집하여] //stackoverflow.com/posts/38559714/edit) –

+0

'\ n \ r'을 정규 표현식에 포함 시키십시오. 업데이트 된 답변을 참조하십시오. –

답변

0

@ Paul Wasilewski에게 훌륭한 솔루션을 제공해 주신 데 대해 감사드립니다. 나는 정규 표현식 문제와 관련이없는 문제를 발견했다.

내 5 개의 항목은 색인 생성되지 않았으므로 MongoDB가 색인을 생성 할 수 없도록 크기가 1024 바이트를 넘었습니다.

그래서 이것이 정규식에 의해 쿼리 될 수없는 이유입니다.

1

앵커 ^을 사용하여 줄의 시작과 일치시키는 것을 보았습니다. 라인이 새로운 라인 \n 또는 캐리지 리턴 문자 \r으로 시작하는 것이 가능할 수 있습니다.

은 정규식 또한

/^([A-Z]|\W|\s|\d|\r|\n|_)/i 

앵커를 제거하기 위해 확인에 \n\r을 포함 해보십시오.

/([A-Z]|\W|\s|\d|\r|\n|_)/i 

마지막 옵션은 정규식을 반전하여 포함되지 않은 레코드를 확인합니다. 이러한 정규식은 빈 문자열을 계산해야합니다.

/^(?![.*])/i 
+0

내가 언급 한 것을 잊어 버렸습니다. 정규 표현식은 압축 된 버전입니다. 실제로 다음과 같은 것을 사용하고 있습니다 : A | B | C | D ... 파이썬 배열에서 생성하기 때문에 여러 동시 프로세스의 데이터베이스. 나는 이중 점검을하고 이것들에 오류가 없다. 그들은 정확하게 나에게 게시 된 정규 표현식과 같은 결과를 준다. 그래서 문제는 다른 곳에 있습니다. – ElCapitaine

+0

두 명령을 모두 시도했지만 여전히 동일한 결과를 제공합니다. 내가 읽을 수있는 것부터 \ W는 다른 모든 것에 매치되어야하지만 그렇지 않습니다. 그래서 내 생각 엔 정규 문자열로 처리 할 수없는 빈 문자열이나 특수 문자가 있다고 생각합니다. 그게 가능하니? – ElCapitaine

+0

@ ElCapitaine, 빈 문자열은 좋은 설명이 될 수 있습니다. regex^(?! [. *])를 반전하여 결과를 살펴보십시오. 빈 문자열도 찾아야합니다. –