드름이 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는 단순한 일반 수학 용어로 보이기 때문에 혼동이 되는 경우가 있어 매뉴얼을 정비할 필요가 있다는 의견도 있네요. 저도 동의하는 바입니다.

 


출처: $mod — MongoDB Manual