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

$bitAnd (位表达式)

适用对象: MongoDB vCore

$bitAnd 运算符对整数值执行按位 AND 运算。 它将第一个作数的每一位与第二个作数的对应位进行比较。 如果两个位均为 1,则对应的结果位将设置为 1。 否则,将对应的结果位设置为 0。

语法

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

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

参数

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

示例:

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

{
  "_id": "40d6f4d7-50cd-4929-9a07-0a7a133c2e74",
  "name": "Proseware, Inc. | Home Entertainment Hub - East Linwoodbury",
  "location": {
    "lat": 70.1272,
    "lon": 69.7296
  },
  "staff": {
    "totalStaff": {
      "fullTime": 19,
      "partTime": 20
    }
  },
  "sales": {
    "totalSales": 151864,
    "salesByCategory": [
      {
        "categoryName": "Sound Bars",
        "totalSales": 2120
      },
      {
        "categoryName": "Home Theater Projectors",
        "totalSales": 45004
      },
      {
        "categoryName": "Game Controllers",
        "totalSales": 43522
      },
      {
        "categoryName": "Remote Controls",
        "totalSales": 28946
      },
      {
        "categoryName": "VR Games",
        "totalSales": 32272
      }
    ]
  },
  "promotionEvents": [
    {
      "eventName": "Discount Delight Days",
      "promotionalDates": {
        "startDate": {
          "Year": 2023,
          "Month": 12,
          "Day": 26
        },
        "endDate": {
          "Year": 2024,
          "Month": 1,
          "Day": 5
        }
      },
      "discounts": [
        {
          "categoryName": "Game Controllers",
          "discountPercentage": 22
        },
        {
          "categoryName": "Home Theater Projectors",
          "discountPercentage": 23
        }
      ]
    }
  ]
}

示例 1:基本按位 AND作

对教职员工编号执行按位 AND作以创建权限标志。

db.stores.aggregate([
  { $match: {"_id": "40d6f4d7-50cd-4929-9a07-0a7a133c2e74"} },
  {
    $project: {
      name: 1,
      fullTimeStaff: "$staff.totalStaff.fullTime",
      partTimeStaff: "$staff.totalStaff.partTime",
      staffPermissionFlag: {
        $bitAnd: ["$staff.totalStaff.fullTime", "$staff.totalStaff.partTime"]
      }
    }
  }
])

这将生成以下输出:

[
  {
    _id: '40d6f4d7-50cd-4929-9a07-0a7a133c2e74',
    name: 'Proseware, Inc. | Home Entertainment Hub - East Linwoodbury',
    fullTimeStaff: 20,
    partTimeStaff: 19,
    staffPermissionFlag: 16
  }
]

按位 AND 为 19(以二进制为单位为 10011)和 20(二进制为 10100),等于 16(二进制为 10000)。

示例 2:与折扣百分比一起使用$bitAnd

对折扣百分比应用按位 AND作以创建组合的折扣标志。

db.stores.aggregate([
  { $match: {"_id": "40d6f4d7-50cd-4929-9a07-0a7a133c2e74"} },
  { $unwind: "$promotionEvents" },
  { $match: {"promotionEvents.eventName": "Discount Delight Days"} },
  { $unwind: "$promotionEvents.discounts" },
  {
    $project: {
      name: 1,
      eventName: "$promotionEvents.eventName",
      categoryName: "$promotionEvents.discounts.categoryName",
      discountPercentage: "$promotionEvents.discounts.discountPercentage",
      discountFlag: {
        $bitAnd: ["$promotionEvents.discounts.discountPercentage", 31]
      }
    }
  }
])

这将生成以下输出:

[
  {
    _id: '40d6f4d7-50cd-4929-9a07-0a7a133c2e74',
    name: 'Proseware, Inc. | Home Entertainment Hub - East Linwoodbury',
    eventName: 'Discount Delight Days',
    categoryName: 'Game Controllers',
    discountPercentage: 22,
    discountFlag: 22
  },
  {
    _id: '40d6f4d7-50cd-4929-9a07-0a7a133c2e74',
    name: 'Proseware, Inc. | Home Entertainment Hub - East Linwoodbury',
    eventName: 'Discount Delight Days',
    categoryName: 'Home Theater Projectors',
    discountPercentage: 23,
    discountFlag: 23
  },
  .
  .
  .
]

以 31(二进制为单位为 11111)的按位 AND 运算提取每个折扣百分比的低 5 位。

示例 3:多个值 $bitAnd

对多个数值字段执行按位 AND 运算。

db.stores.aggregate([
  { $match: {"_id": "40d6f4d7-50cd-4929-9a07-0a7a133c2e74"} },
  {
    $project: {
      name: 1,
      combinedFlag: {
        $bitAnd: [
          "$staff.totalStaff.fullTime",
          "$staff.totalStaff.partTime",
          255
        ]
      }
    }
  }
])

这将生成以下输出:

[
  {
    _id: '40d6f4d7-50cd-4929-9a07-0a7a133c2e74',
    name: 'Proseware, Inc. | Home Entertainment Hub - East Linwoodbury',
    combinedFlag: 16
  }
]

该作对 19、20 和 255 执行按位 AND,结果为 16。