2017-01-30 1 views
0

컬렉션에 부울 필드가 있는데이 필드 값이 false 인 모든 레코드를 쿼리하려고합니다. 이 쿼리에 가장 적합한 디자인 (성능)은 무엇입니까? 이 필드는 부울 true/false를 저장해야합니까? true/null (존재 = 거짓)? 아니면 문자열 형식에 대한 더 나은 성능을 가지고 .. 절약 문자열/빈 문자열 또는 문자열/null (존재 = 거짓)? 어떤 색인을 사용해야합니까?mongo collection by boolean 필드

답변

0

참/거짓이면 부울 유형으로 저장하는 것이 좋습니다. JSON은 부울 유형을 지원합니다. 문자열을 "TRUE"/ "FALSE"또는 "TRUE/FALSE"로 가질 수 있으므로 문자열을 "true"/ "false"로 사용하는 것은 좋지 않습니다. 모두 쿼리에 부담을줍니다. 문자열이므로 해당 필드에 더티 데이터가있을 위험이 있습니다.

쿼리에서 null로 확인하면 {'field':null}, 여기에는 필드가 없거나 필드 값이 실제로 null입니다. 그렇지 않으면 필드가없는 위치를 얻으려면 $ exists {'field' : {$exists : false}}을 사용하십시오. {'field':true}이가 아닌 기존의 필드가 거짓으로 고려하고 그 논리를 포함 할 할 하지 같은 경우

{'field' : {$exists : true}} 같은 것을 말할 필요도없이, 어쩌면 $ ne- {'field' : {$ne : true}} 확인하는 것이 좋습니다. 그러나 MongoDB는 부정적인 쿼리를 $ 또는 오히려 부정적인 쿼리를 추천합니다. {$or : [{'field':null},{'field':false}]}

이러한 모든 것들을 문자열로 유지함으로써 수행 할 수도 있습니다.하지만 특별히 문자열을 만들기 위해 스크립트를 실행하는 경우 추가 부담이 있습니다. 부울 비교보다 덜 신뢰할 수있는 비교.

인덱스로 돌아 오면 인덱스가 부울 유형과 잘 맞지 않습니다. 데이터를 분리 할 필요가 없기 때문에 인덱스가 더 이상 필요하지 않습니다.하지만 String 일지라도 궁극적으로 인덱스를 기반으로하므로 단지 두 개 (또는 세 개)의 값. 그래서 비교 우위는 보이지 않습니다.

관련 문제