Compartir a través de


$bitXor

El $bitXor operador realiza una operación OR (XOR) exclusiva bit a bit en valores enteros. La operación XOR devuelve 1 para cada posición de bits donde los bits correspondientes de los operandos son diferentes y 0 donde son iguales.

Sintaxis

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

Parámetros

Parámetro Descripción
expression1, expression2, ... Expresiones que se resuelven en valores enteros. El operador realiza operaciones XOR en estos valores en secuencia.

Examples

Considere este documento de ejemplo de la colección de tiendas.

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

Ejemplo 1: operación XOR básica

Esta consulta usa una canalización de agregación para calcular entre recuentos de personal de tiempo completo y de tiempo parcial para un almacén específico. El documento resultante contiene los detalles del almacén junto con un campo calculado. La operación XOR entre 19 (binario: 10011) y 20 (binario: 10100) da como resultado 7 (binario: 00111).

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

Esta consulta devuelve el resultado siguiente.

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

Ejemplo 2: XOR con varios valores

Esta consulta calcula el XOR bit a bit de todos los porcentajes de descuento para el Discount Delight Days evento de un almacén específico. El documento resultante representa el cálculo XOR bit a bit de todos los porcentajes de descuento para el Discount Delight Days evento.

db.stores.aggregate([{
        $match: {
            _id: "40d6f4d7-50cd-4929-9a07-0a7a133c2e74"
        }
    },
    {
        $unwind: "$promotionEvents"
    },
    {
        $match: {
            "promotionEvents.eventName": "Discount Delight Days"
        }
    },
    {
        $unwind: "$promotionEvents.discounts"
    },
    {
        $group: {
            _id: "$_id",
            name: {
                $first: "$name"
            },
            eventName: {
                $first: "$promotionEvents.eventName"
            },
            discountPercentages: {
                $push: "$promotionEvents.discounts.discountPercentage"
            }
        }
    },
    {
        $project: {
            name: 1,
            eventName: 1,
            discountPercentages: 1,
            xorResult: {
                $reduce: {
                    input: {
                        $map: {
                            input: "$discountPercentages",
                            as: "val",
                            in: {
                                $toLong: "$$val"
                            }
                        }
                    },
                    initialValue: {
                        $toLong: 0
                    },
                    in: {
                        $bitXor: ["$$value", "$$this"]
                    }
                }
            }
        }
    }
])

Esta consulta devuelve el resultado siguiente.

[
  {
    "_id": "40d6f4d7-50cd-4929-9a07-0a7a133c2e74",
    "name": "Proseware, Inc. | Home Entertainment Hub - East Linwoodbury",
    "eventName": "Discount Delight Days",
    "discountPercentages": [22, 23, 10, 10, 9, 24],
    "xorResult": { "$numberLong": "16" }
  }
]