模组

$mod 运算符用于对字段的值执行模态运算,并选择具有指定结果的文档。 运算符 $mod 可用于基于循环模式对数据进行分组或筛选。

语法

$mod 运算符的语法为:

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

参数

参数 DESCRIPTION
field 将应用取模操作的字段
divisor 字段值将除以的数字
remainder 用于与模运算结果进行比较的余数

例子

请查看 StoreData 数据库中 stores 集合的这个示例文档。

{
    "_id": "0fcc0bf0-ed18-4ab8-b558-9848e18058f4",
    "name": "First Up Consultants | Beverage Shop - Satterfieldmouth",
    "location": {
        "lat": -89.2384,
        "lon": -46.4012
    },
    "staff": {
        "totalStaff": {
            "fullTime": 8,
            "partTime": 20
        }
    },
    "sales": {
        "totalSales": 75670,
        "salesByCategory": [
            {
                "categoryName": "Wine Accessories",
                "totalSales": 34440
            },
            {
                "categoryName": "Bitters",
                "totalSales": 39496
            },
            {
                "categoryName": "Rum",
                "totalSales": 1734
            }
        ]
    },
    "promotionEvents": [
        {
            "eventName": "Unbeatable Bargain Bash",
            "promotionalDates": {
                "startDate": {
                    "Year": 2024,
                    "Month": 6,
                    "Day": 23
                },
                "endDate": {
                    "Year": 2024,
                    "Month": 7,
                    "Day": 2
                }
            },
            "discounts": [
                {
                    "categoryName": "Whiskey",
                    "discountPercentage": 7
                },
                {
                    "categoryName": "Bitters",
                    "discountPercentage": 15
                },
                {
                    "categoryName": "Brandy",
                    "discountPercentage": 8
                },
                {
                    "categoryName": "Sports Drinks",
                    "discountPercentage": 22
                },
                {
                    "categoryName": "Vodka",
                    "discountPercentage": 19
                }
            ]
        },
        {
            "eventName": "Steal of a Deal Days",
            "promotionalDates": {
                "startDate": {
                    "Year": 2024,
                    "Month": 9,
                    "Day": 21
                },
                "endDate": {
                    "Year": 2024,
                    "Month": 9,
                    "Day": 29
                }
            },
            "discounts": [
                {
                    "categoryName": "Organic Wine",
                    "discountPercentage": 19
                },
                {
                    "categoryName": "White Wine",
                    "discountPercentage": 20
                },
                {
                    "categoryName": "Sparkling Wine",
                    "discountPercentage": 19
                },
                {
                    "categoryName": "Whiskey",
                    "discountPercentage": 17
                },
                {
                    "categoryName": "Vodka",
                    "discountPercentage": 23
                }
            ]
        }
    ]
}

示例 1 - 查找包含偶数个员工的文档

db.stores.find({"staff.totalStaff.fullTime": {"$mod": [2, 0]}}, {"staff": true})

返回的两个文档包括:

{
    "_id": "bd03a80f-f463-4997-b886-42547093965f",
    "staff": {
        "totalStaff": {
            "fullTime": 16,
            "partTime": 8
        }
    }
},
{
    "_id": "a2617acd-03a4-4d11-b892-95916738c858",
    "staff": {
        "totalStaff": {
            "fullTime": 10,
            "partTime": 16
        }
    }
}

示例 2 - 查找具有浮点除数的包含偶数个员工的文档

$mod 运算符将 $mod 运算符的浮点数向下舍入。

以下查询都会产生相同的结果。

db.stores.find({"staff.totalStaff.fullTime": {"$mod": [2.0, 0]}}, {"staff": true})
db.stores.find({"staff.totalStaff.fullTime": {"$mod": [2.25, 0]}}, {"staff": true})
db.stores.find({"staff.totalStaff.fullTime": {"$mod": [2.5, 0]}}, {"staff": true})
db.stores.find({"staff.totalStaff.fullTime": {"$mod": [2.9, 0]}}, {"staff": true})

所有查询都生成相同的结果。 返回的两个文档包括:

{
    "_id": "ed319c06-731d-45fc-8a47-b05af8637cdf",
    "staff": {
        "totalStaff": {
            "fullTime": 10,
            "partTime": 3
        }
    }
},
{
    "_id": "28d7569c-1bae-40be-9958-c3110b6253fd",
    "staff": {
        "totalStaff": {
            "fullTime": 4,
            "partTime": 14
        }
    }
}

注意事项

  • 如果在$mod运算符的数组中指定了少于两个值,则服务器会引发错误,指示传递的参数不够。
  • 如果在$mod运算符的数组中指定了两个以上的值,则服务器会引发错误,指示传递的参数过多。