Definición
Sintaxis
Para especificar una expresión $mod, utilice la siguiente sintaxis:
{ field: { $mod: [ divisor, remainder ] } }
Comportamiento
El operador $mod devuelve un error si el arreglo [ divisor, remainder ] contiene menos o más de dos elementos. Para ejemplos, consulte Error de elementos insuficientes y Error de demasiados elementos respectivamente.
Además, a partir de MongoDB 5.1 (y 5.0.4), $mod devuelve un error si los valores de divisor o remainder se evalúan como:
NaN(no es un número).Infinity.Un valor que no puede representarse utilizando un entero de 64 bits.
Si un documento en la colección contiene un campo cuyo valor es NaN (no es un número) o Infinity, $mod no incluye el documento en la salida.
Dividendos negativos
Cuando el dividendo es negativo, el residuo también es negativo. Para obtener más detalles sobre este comportamiento, consulta la documentación oficial de JavaScript.
Para un ejemplo, consulta Dividendo Negativo.
Ejemplos
Use $mod para seleccionar documentos
Crea una colección de inventory:
db.inventory.insertMany( [ { _id: 1, item: "abc123", qty: 0 }, { _id: 2, item: "xyz123", qty: 5 }, { _id: 3, item: "ijk123", qty: 12 } ] )
Luego, la siguiente query selecciona los documentos en la colección inventory donde el valor del campo qty módulo 4 es igual a 0:
db.inventory.find( { qty: { $mod: [ 4, 0 ] } } )
La query devuelve los siguientes documentos:
[ { _id: 1, item: 'abc123', qty: 0 }, { _id: 3, item: 'ijk123', qty: 12 } ]
Error de elementos insuficientes
El $mod operador genera un error cuando se le pasa un array con menos de dos elementos.
Arreglo de un solo elemento
La siguiente operación pasa incorrectamente al operador un array que contiene un único $mod elemento:
db.inventory.find( { qty: { $mod: [ 4 ] } } )
La instrucción da como resultado el siguiente error:
MongoServerError: malformed mod, not enough elements
Arreglo vacío
La siguiente operación pasa incorrectamente $mod un array vacío al operador:
db.inventory.find( { qty: { $mod: [ ] } } )
La instrucción da como resultado el siguiente error:
MongoServerError: malformed mod, not enough elements
Error por demasiados elementos
El $mod operador genera un error cuando se le pasa un array con más de dos elementos.
Por ejemplo, la siguiente operación intenta utilizar el operador con una matriz que contiene cuatro $mod elementos:
db.inventory.find( { qty: { $mod: [ 4, 1, 2, 3 ] } } )
La instrucción da como resultado el siguiente error:
MongoServerError: malformed mod, too many elements
Argumentos de punto flotante
La expresión $mod redondea la entrada decimal hacia cero.
Los siguientes ejemplos demuestran este comportamiento:
Ejemplo
Input query:
db.inventory.find( { qty: { $mod: [ 4.0, 0 ] } } )
Resultados:
[ { _id: 1, item: 'abc123', qty: 0 }, { _id: 3, item: 'ijk123', qty: 12 } ]
Ejemplo
Input query:
db.inventory.find( { qty: { $mod: [ 4.5, 0 ] } } )
Resultados:
[ { _id: 1, item: 'abc123', qty: 0 }, { _id: 3, item: 'ijk123', qty: 12 } ]
Ejemplo
Input query:
db.inventory.find( { qty: { $mod: [ 4.99, 0 ] } } )
Resultados:
[ { _id: 1, item: 'abc123', qty: 0 }, { _id: 3, item: 'ijk123', qty: 12 } ]
Cada query aplica 4 a la expresión $mod independientemente de los puntos decimales, lo que resulta en el mismo conjunto de resultados.
Dividendos negativos
La expresión $mod produce un resultado negativo cuando el dividendo es negativo.
El siguiente ejemplo demuestra este comportamiento:
Ejemplo
Input query:
db.inventory.find( { qty: { $mod: [ -4, -0 ] } } )
Esta query devuelve dos documentos porque el qty tiene un residuo de -0 cuando el dividendo es negativo y -0 es igual a 0 en JavaScript. Para obtener detalles sobre esta igualdad, consulte la documentación oficial de JavaScript.
Resultados:
[ { _id: 1, item: 'abc123', qty: 0 }, { _id: 3, item: 'ijk123', qty: 12 } ]