$mod
定义
语法
要指定一个 $mod
表达式,使用以下语法
{ field: { $mod: [ divisor, remainder ] } }
行为
$mod
如果 [ divisor, remainder ]
数组不包含两个元素时,会返回一个错误。请参阅以下示例元素不足错误 和 元素过多错误 分别。
此外,从 MongoDB 5.1(及 5.0.4)版本开始,如果 divisor
或 remainder
的值评估为
NaN
(不是一个数字)。无穷大
.无法使用 64 位整数表示的值。
如果集合中的文档包含值为 NaN
(不是一个数字)或 Infinity
的字段,$mod
将不会将该文档包含在输出中。
负被除数
当除数是负数时,余数也是负数。关于此行为的更多详细信息,请参阅官方JavaScript文档。
例如,请参阅负除数。
示例
使用$mod
选择文档
创建一个库存
集合
db.inventory.insertMany( [ { "_id" : 1, "item" : "abc123", "qty" : 0 }, { "_id" : 2, "item" : "xyz123", "qty" : 5 }, { "_id" : 3, "item" : "ijk123", "qty" : 12 } ] )
然后,以下查询选择在库存
集合中,数量
字段的值模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 ] } } )
此查询返回两个文档,因为当被除数是负数时,qty
的余数为 -0
,而在 JavaScript 中 -0
等于 0
。有关此等性的详细信息,请参阅 官方 JavaScript 文档。
结果
[ { _id: 1, item: 'abc123', qty: 0 }, { _id: 3, item: 'ijk123', qty: 12 } ]