Compartilhar via


$bitOr (expressão bit a bit)

APLICA-SE A: MongoDB vCore

O $bitOr operador executa uma operação OR bit a bit em valores inteiros. Ele compara cada bit do primeiro operando com o bit correspondente do segundo operando. Se qualquer bit for 1, o bit de resultado correspondente será definido como 1. Se ambos os bits forem 0, o bit de resultado correspondente será definido como 0.

Sintaxe

A sintaxe do operador é a $isArray seguinte:

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

Parâmetros

Descrição
expression1, expression2, ... Expressões que são avaliadas como inteiros. O $bitOr operador executa uma operação OR bit a bit em todas as expressões fornecidas.

Exemplo

Vamos entender o uso com o JSON de exemplo do conjunto de dados stores.

{
  "_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
        }
      ]
    }
  ]
}

Exemplo 1: Operação OR bit a bit básica

Execute uma operação OR bit a bit em números de equipe para combinar sinalizadores de permissão.

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"]
      }
    }
  }
])

Isso produzirá a seguinte saída:

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

O OR bit a bit de 3 (011 em binário) e 2 (010 em binário) é igual a 3 (011 em binário).

Exemplo 2: Usando $bitOr com dados de vendas

Aplique operações OR bit a bit em números de vendas para criar sinalizadores combinados.

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

Isso produzirá a seguinte saída:

[
  {
    _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
  }
]

Exemplo 3: OR bit a bit múltiplo com porcentagens de desconto

Execute a operação OR bit a bit em vários valores de desconto.

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"
              ]
            }
          }
        }
      }
    }
  }
])

Isso produzirá a seguinte saída:

[
  {
    _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
      }
    ]
  }
]

A operação combina percentuais de desconto com números de pessoal usando OR bit a bit: 7|3|2 = 7 e 11|3|2 = 11.

Exemplo 4: Criando sinalizadores de permissão

Use OR bit a bit para criar sinalizadores de permissão combinando diferentes níveis de acesso.

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

Isso produzirá a seguinte saída:

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