2016-12-05 4 views
0

600.000 개의 문서가 포함 된 거대한 모음집이 있습니다. 불행히도 중복되는 부분이 있으므로 찾아야합니다. 이러한 중복은 첫 글자 대문자 만 다릅니다.MongoDB : DB에서 대문자와 소문자를 모두 찾습니다.

{ key: 'Find me' }, 
{ key: 'find me' }, 
{ key: 'Don't find me }, // just one document for this string 
{ key: 'don't find me either } // just one document for this string 

는 지금은 모든 중복을 얻기 위해 기존의 대문자와 소문자 문자열이 의미합니다.

+0

600k는별로 좋아 보이지 않습니다. 이 문자열이 너무 길지 않으면 (즉, 책이 아님) 모든 문자열이 메모리에 저장되어야합니다. 문서 당 평균 80 개의 문자 (터미널에서 한 줄까지)로만 ~ 48MB입니다. 따라서 모든 것을 데이터베이스 클라이언트에로드하고 메모리에서 처리하는 것이 좋습니다. Mongo (DB 측 함수)로도 처리 할 수 ​​있지만 전체 데이터베이스를 차단합니다. 또한지도/축소 시도 할 수 있지만 더 복잡한 솔루션 것 같습니다. 나는 그것이 당신이 가진 모든 선택이라고 생각합니다. – freakish

+0

모든 항목이 실제로 작기 때문에 (10 ~ 20 자) 좋은 결과가 나옵니다. 그러면 배열에서 중복 된 항목을 가져 오는 일반적인 자바 스크립트 질문이됩니다. – user3142695

답변

0

MongoDB에는 사용할 수있는 $toLower 변환이 있습니다. 여기

가 (당신이 컬렉션의 이름으로 db.collection을 변경할 필요가) 두 번 이상 나타나는 출력 모든 키에 대한 방법입니다 :

db.collection.aggregate([ 
    { $group: 
     { 
      _id: { $toLower: "$key" }, 
      cnt: { "$sum": 1 } 
     } 
    }, 
    { $match: 
     { cnt: {$gt: 1 } } 
    } 
]) 

첫째, $groups 그룹 문서 key (대소 문자 구분)에 의해 . 각 키의 문서 수는 cnt에 누적됩니다. 내용은 $group 후, 당신은 같은 것을 끝낼 : 다음

{"key": "find me", "cnt": 2} 
{"key": "other key", "cnt": 1} 
... 

$match 1.

보다 greated하게 cnt 만 사람을 유지, 그 결과를 필터링 : 위의 코드는 몽고 껍질을 위해. 자바 스크립트에서 mongodb 드라이버를 사용하여 거의 동일하게 수행 할 수 있지만 $group과 같은 따옴표를 추가해야합니다.

+0

이 예제는 올바르지 않습니다 – sergiuz

+1

복사하여 붙여 넣기를하고 잘못된 필드를 변경했습니다 ... 문제가 해결되었습니다. 죄송합니다. – Derlin

관련 문제