MongoDB/Evaluation Query Operators
[MongoDB] $mod
드름이
2022. 7. 1. 16:36
요약: A로 나눠서 B가 남는 document를 모두 가져올 때 $mod를 사용
{ field: { $mod: [ 몫, 나머지 ] } }
아래와 같이 inventory collection에 documents를 삽입했다고 가정합니다.
db.inventory.insertMany( [
{ "_id" : 1, "상품" : "abc123", "수량" : 0 },
{ "_id" : 2, "상품" : "xyz123", "수량" : 5 },
{ "_id" : 3, "상품" : "ijk123", "수량" : 12 }
] )
1. 위의 document에서 "수량" 필드의 값을 4로 나눈 나머지가 0인 모든 문서를 선택합니다.
db.inventory.find( { qty: { $mod: [ 4, 0 ] } } )
위 구문의 결과는 다음과 같습니다.
{ "_id" : 1, "상품" : "abc123", "수량" : 0 }
{ "_id" : 3, "상품" : "ijk123", "수량" : 12 }
2. 에러
몫과 나머지 모두 주어져야 하며 아래 예시처럼 하나라도 빠지거나 추가되면 에러가 발생합니다.
db.inventory.find( { 수량: { $mod: [ 4 ] } } )
// 에러 발생
MongoServerError: malformed mod, not enough elements
db.inventory.find( { qty: { $mod: [ ] } } )
// 에러 발생
MongoServerError: malformed mod, not enough elements
db.inventory.find( { qty: { $mod: [ 4, 1, 2, 3 ] } } )
// 에러 발생
MongoServerError: malformed mod, too many elements
3. 몫이 소수점으로 주어져도 소수점은 무시됩니다.
db.inventory.find( { 수량: { $mod: [ 4.0, 0 ] } } )
db.inventory.find( { 수량: { $mod: [ 4.5, 0 ] } } )
db.inventory.find( { 수량: { $mod: [ 4.99, 0 ] } } )
// 몫은 모두 4로 간주됩니다.
왜 이렇게 해놨을까요..?
소수점 계산이 반올림 오류에 취약하기 때문에 제한한 것으로 보입니다.
다만 대부분의 사용자들이 보기에 $mod는 단순한 일반 수학 용어로 보이기 때문에 혼동이 되는 경우가 있어 매뉴얼을 정비할 필요가 있다는 의견도 있네요. 저도 동의하는 바입니다.