2014-03-31 3 views
1

다른 사용자의 필드 이메일을 사용하여 내 사용자를 나타내는 문서가 있기 때문에 데이터베이스에 문제가 있습니다 (유령 사용자를 생성하고 기다리는 기능 등록). 사용자가 등록 할 때, 나는 그의 이메일의 낮은 버전을 사용하고 이전 항목을 덮어 씁니다. 문제는 '고스트'이메일이 낮추지 않았다는 것입니다.mongodb - 같은 필드이지만 대소 문자가 다른 모든 문서를 찾습니다.

[email protected] 고스트가 생성되면 [email protected]이 등록되어 '[email protected]'으로 인식되므로 [email protected]이 데이터베이스를 오염시킵니다.

중복 된 항목을 찾으려면 방법을 찾고 관련없는 항목은 손으로 떼어 내야합니다. 아이디어?

감사합니다.

답변

0

당신이 찾고있는 것을 얻기 위해 투영과 toLower 기능을 사용할 수 있습니다. 이 사용자 이름과 모든 사용자를 찾을 수

db.users.aggregate(
    {$match : {"username":{$exists:true}}}, 
    { $project : {"username":{"$toLower":["$username"]}}}, 
    { $group : {_id : "$username", total : { $sum : 1 } } }, 
    { $match : { total : { $gte : 2 } } }, 
    { $sort : {total : -1} }, 
    { $limit : 5 } 
); 

:

+0

안녕하세요! 답변 주셔서 감사합니다. 문제는 내가 어떤 이메일이 중복되는지 전혀 모른다는 것이다. 나는 $ project에 익숙하지 않다. 나는 그것에 대해 읽을 것이다. 내 필요에 맞게 $ match 부분을 변경하는 것이 가능하다고 생각하십니까? – Dimitrium

+0

일치하기 전에 속성을 lowerCase로 변환해야 모든 문서를 가져올 수 있습니다. 어떤 속성이 중복 될지 모르는 경우 $ OR을 사용하여 모든 속성을 포함 할 수 있습니다. – hellboy

3

이 시도 - 속성 이름은 "이메일"컬렉션 문서에 있다고 가정하면, 여기 달성하는 방법의 예입니다 사용자 이름을 소문자로 만든 다음 사용자 이름별로 그룹화하고 1보다 큰 사용자 이름을 표시하십시오.

관련 문제