$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 } ]