你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

$bitOr(按位表达式)

适用对象: MongoDB vCore

$bitOr 运算符对整数值执行按位 OR 运算。 它将第一个作数的每一位与第二个作数的对应位进行比较。 如果其中一个位是 1,则将对应的结果位设置为 1。 如果这两个位均为 0,则相应的结果位设置为 0。

语法

运算符的 $isArray 语法如下所示:

{
  $bitOr: [ <expression1>, <expression2>, ... ]
}

参数

DESCRIPTION
expression1, expression2, ... 计算结果为整数的表达式。 该 $bitOr 运算符对所有提供的表达式执行按位 OR 运算。

示例:

让我们了解 stores 数据集中的示例 json 的用法。

{
  "_id": "f2a8c190-28e4-4e14-9d8b-0256e53dca66",
  "name": "Fabrikam, Inc. | Car Accessory Outlet - West Adele",
  "location": {
    "lat": -47.2548,
    "lon": -38.4071
  },
  "staff": {
    "totalStaff": {
      "fullTime": 3,
      "partTime": 2
    }
  },
  "sales": {
    "totalSales": 31211,
    "salesByCategory": [
      {
        "categoryName": "Phone Mounts",
        "totalSales": 8911
      },
      {
        "categoryName": "Dash Cameras",
        "totalSales": 22300
      }
    ]
  },
  "promotionEvents": [
    {
      "eventName": "Super Saver Spectacular",
      "promotionalDates": {
        "startDate": {
          "Year": 2024,
          "Month": 3,
          "Day": 25
        },
        "endDate": {
          "Year": 2024,
          "Month": 4,
          "Day": 1
        }
      },
      "discounts": [
        {
          "categoryName": "Car Chargers",
          "discountPercentage": 7
        },
        {
          "categoryName": "Dash Cameras",
          "discountPercentage": 11
        }
      ]
    }
  ]
}

示例 1:基本按位 OR作

对教职员工编号执行按位 OR作以合并权限标志。

db.stores.aggregate([
  { $match: {"_id": "f2a8c190-28e4-4e14-9d8b-0256e53dca66"} },
  {
    $project: {
      name: 1,
      fullTimeStaff: "$staff.totalStaff.fullTime",
      partTimeStaff: "$staff.totalStaff.partTime",
      combinedStaffFlag: {
        $bitOr: ["$staff.totalStaff.fullTime", "$staff.totalStaff.partTime"]
      }
    }
  }
])

这将生成以下输出:

[
  {
    _id: 'f2a8c190-28e4-4e14-9d8b-0256e53dca66',
    name: 'Fabrikam, Inc. | Car Accessory Outlet - West Adele',
    fullTimeStaff: 3,
    partTimeStaff: 2,
    combinedStaffFlag: 3
  }
]

按位 OR 为 3(二进制为 011)和 2(二进制为 010)等于 3(二进制为 011)。

示例 2:对销售数据使用$bitOr

对销售数字应用按位 OR作以创建组合标志。

db.stores.aggregate([
  { $match: {"_id": "f2a8c190-28e4-4e14-9d8b-0256e53dca66"} },
  { $unwind: "$sales.salesByCategory" },
  {
    $project: {
      name: 1,
      categoryName: "$sales.salesByCategory.categoryName",
      totalSales: "$sales.salesByCategory.totalSales",
      // Combine lower 8 bits of sales with a base flag (15 = 00001111)
      salesFlag: {
        $bitOr: [
          { $toInt: { $mod: ["$sales.salesByCategory.totalSales", 256] } },
          15
        ]
      }
    }
  }
])

这将生成以下输出:

[
  {
    _id: 'f2a8c190-28e4-4e14-9d8b-0256e53dca66',
    name: 'Fabrikam, Inc. | Car Accessory Outlet - West Adele',
    categoryName: 'Phone Mounts',
    totalSales: 8911,
    salesFlag: 207
  },
  {
    _id: 'f2a8c190-28e4-4e14-9d8b-0256e53dca66',
    name: 'Fabrikam, Inc. | Car Accessory Outlet - West Adele',
    categoryName: 'Dash Cameras',
    totalSales: 22300,
    salesFlag: 31
  }
]

示例 3:按位或具有折扣百分比的多个值

对多个折扣值执行按位 OR作。

db.stores.aggregate([
  { $match: {"_id": "f2a8c190-28e4-4e14-9d8b-0256e53dca66"} },
  { $unwind: "$promotionEvents" },
  { $match: {"promotionEvents.eventName": "Super Saver Spectacular"} },
  {
    $project: {
      name: 1,
      eventName: "$promotionEvents.eventName",
      discountFlags: {
        $map: {
          input: "$promotionEvents.discounts",
          as: "discount",
          in: {
            categoryName: "$$discount.categoryName",
            discountPercentage: "$$discount.discountPercentage",
            combinedFlag: {
              $bitOr: [
                "$$discount.discountPercentage",
                "$staff.totalStaff.fullTime",
                "$staff.totalStaff.partTime"
              ]
            }
          }
        }
      }
    }
  }
])

这将生成以下输出:

[
  {
    _id: 'f2a8c190-28e4-4e14-9d8b-0256e53dca66',
    name: 'Fabrikam, Inc. | Car Accessory Outlet - West Adele',
    eventName: 'Super Saver Spectacular',
    discountFlags: [
      {
        categoryName: 'Car Chargers',
        discountPercentage: 7,
        combinedFlag: 7
      },
      {
        categoryName: 'Dash Cameras',
        discountPercentage: 11,
        combinedFlag: 11
      }
    ]
  }
]

该作使用按位 OR 将折扣百分比与员工编号组合在一起:7|3|2 = 7 和 11|3|2 = 11。

示例 4:创建权限标志

通过组合不同的访问级别,使用按位 OR 创建权限标志。

db.stores.aggregate([
  { $match: {"_id": "f2a8c190-28e4-4e14-9d8b-0256e53dca66"} },
  {
    $project: {
      name: 1,
      // Create permission flags: 1=read, 2=write, 4=execute
      readPermission: 1,
      writePermission: 2,
      executePermission: 4,
      fullPermissions: {
        $bitOr: [1, 2, 4]
      },
      staffBasedPermissions: {
        $bitOr: [
          "$staff.totalStaff.fullTime",
          "$staff.totalStaff.partTime",
          8
        ]
      }
    }
  }
])

这将生成以下输出:

[
  {
    _id: 'f2a8c190-28e4-4e14-9d8b-0256e53dca66',
    name: 'Fabrikam, Inc. | Car Accessory Outlet - West Adele',
    fullPermissions: 7,
    staffBasedPermissions: 11
  }
]