“文档” 菜单
文档首页
/
MongoDB Manual
/ / / /

$mod

在此页面上

  • 定义
  • 语法
  • 行为
  • 举例
$mod

选择字段值除以除数后具有指定余数的文档。也就是说,$mod 执行取模运算来选择文档。第一个参数是被除数,第二个参数是余数。

要指定 $mod 表达式,请使用以下语法:

{ field: { $mod: [ divisor, remainder ] } }

如果 [ divisor, remainder ] 数组包含的元素少于或多于两个,则 $mod 操作符会返回错误。有关示例,请分别参阅元素不足错误元素过多错误

此外,从 MongoDB 5.1(和 5.0.4)开始,如果 divisorremainder 值的计算结果为以下值,则 $mod 会返回错误:

  • NaN (不是数字)。

  • Infinity

  • 不能使用 64 位整数表示的值。

如果集合中的某个文档包含值为 NaN(不是数字)或 Infinity 的字段,则 $mod 不会在输出中包含该文档。

当被除数为负数时,余数也是负数。有关此行为的更多详细信息,请参阅 JavaScript 官方文档

有关示例,请参阅负被除数

创建一个 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 }
]
← $jsonSchema
$regex →