$mod
定义
语法
要指定 $mod
表达式,请使用以下语法:
{ field: { $mod: [ divisor, remainder ] } }
行为
$mod
如果[ divisor, remainder ]
数组不包含两个元素,则会返回错误。 有关示例,请分别参阅元素不足错误和元素过多错误。
此外,从 MongoDB 5.1(和 5.0.4)开始,如果 divisor
或 remainder
值的计算结果为以下值,则 $mod
会返回错误:
NaN
(不是数字)。Infinity
.不能使用 64 位整数表示的值。
如果集合中的某个文档包含值为 NaN
(不是数字)或 Infinity
的字段,则 $mod
不会在输出中包含该文档。
负被除数
当被除数为负数时,余数也是负数。有关此行为的更多详细信息,请参阅 JavaScript 官方文档。
有关示例,请参阅负被除数。
示例
使用$mod
选择文档
创建一个 inventory
集合:
db.inventory.insertMany( [ { "_id" : 1, "item" : "abc123", "qty" : 0 }, { "_id" : 2, "item" : "xyz123", "qty" : 5 }, { "_id" : 3, "item" : "ijk123", "qty" : 12 } ] )
以下查询会在 inventory
集合中选择 qty
字段的值模数 4
等于 0
的文档:
db.inventory.find( { qty: { $mod: [ 4, 0 ] } } )
该查询返回以下文档:
[ { '_id' : 1, 'item' : 'abc123', 'qty' : 0 }, { '_id' : 3, 'item' : 'ijk123', 'qty' : 12 } ]
元素不足错误
当传递的数组元素少于两个时,$mod
操作符会出错。
具有单个元素的数组
以下操作错误地向 $mod
操作符传递了包含单个元素的数组:
db.inventory.find( { qty: { $mod: [ 4 ] } } )
该语句会导致以下错误:
MongoServerError: malformed mod, not enough elements
空数组
以下操作错误地将 $mod
操作符传递给了一个空数组:
db.inventory.find( { qty: { $mod: [ ] } } )
该语句会导致以下错误:
MongoServerError: malformed mod, not enough elements
元素过多错误
当传递的数组其元素超过两个时,$mod
操作符会出错。
例如,下面的操作尝试在包含四个元素的数组中使用 $mod
操作符:
db.inventory.find( { qty: { $mod: [ 4, 1, 2, 3 ] } } )
该语句会导致以下错误:
MongoServerError: malformed mod, too many elements
浮点参数
$mod
表达式将十进制输入值舍入为零。
以下示例演示了此行为:
例子
输入查询:
db.inventory.find( { qty: { $mod: [ 4.0, 0 ] } } )
结果:
[ { _id: 1, item: 'abc123', qty: 0 }, { _id: 3, item: 'ijk123', qty: 12 } ]
例子
输入查询:
db.inventory.find( { qty: { $mod: [ 4.5, 0 ] } } )
结果:
[ { _id: 1, item: 'abc123', qty: 0 }, { _id: 3, item: 'ijk123', qty: 12 } ]
例子
输入查询:
db.inventory.find( { qty: { $mod: [ 4.99, 0 ] } } )
结果:
[ { _id: 1, item: 'abc123', qty: 0 }, { _id: 3, item: 'ijk123', qty: 12 } ]
每个查询都将 4
应用于 $mod
表达式,而不考虑小数点,从而得到相同的结果集。
负被除数
当股息为负数时,$mod
表达式会产生负数结果。
以下示例演示了此行为:
例子
输入查询:
db.inventory.find( { qty: { $mod: [ -4, -0 ] } } )
此查询会返回两个文档,因为在 JavaScript 中,当被除数为负且 -0
等于0
时,qty
具有-0
的余数。有关此相等性的详细信息,请参阅 JavaScript 官方文档。
结果:
[ { _id: 1, item: 'abc123', qty: 0 }, { _id: 3, item: 'ijk123', qty: 12 } ]