$abs

L’opérateur $abs retourne la valeur absolue d’un nombre. Il supprime tout signe négatif d’un nombre, ce qui en fait positif.

Syntaxe

{
  $abs: <expression>
}

Paramètres

Paramètre Descriptif
<expression> Toute expression qui se résout en nombre. Si l’expression est null ou fait référence à un champ manquant, $abs retourne null.

Examples

Considérez cet exemple de document de la collection des magasins.

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

Exemple 1 : utiliser la valeur absolue du total des ventes

Pour calculer la différence absolue dans le volume de ventes de chaque catégorie et les ventes moyennes entre toutes les catégories d’un magasin, exécutez d’abord une requête pour filtrer sur le magasin spécifique. Ensuite, calculez la différence entre les ventes entre chaque catégorie et la moyenne entre toutes les catégories. Enfin, projetez la différence absolue à l’aide de l’opérateur $abs.

db.stores.aggregate([{
    $match: {
        _id: "40d6f4d7-50cd-4929-9a07-0a7a133c2e74"
    }
}, {
    $project: {
        name: 1,
        salesByCategory: {
            $map: {
                input: "$sales.salesByCategory",
                as: "category",
                in: {
                    categoryName: "$$category.categoryName",
                    totalSales: "$$category.totalSales",
                    differenceFromAverage: {
                        $abs: {
                            $subtract: ["$$category.totalSales", {
                                $avg: "$sales.salesByCategory.totalSales"
                            }]
                        }
                    }
                }
            }
        }
    }
}])

Cette requête retourne le résultat suivant :

[
  {
    "_id": "40d6f4d7-50cd-4929-9a07-0a7a133c2e74",
    "name": "Proseware, Inc. | Home Entertainment Hub - East Linwoodbury",
    "salesByCategory": [
      {
        "categoryName": "Sound Bars",
        "totalSales": 2120,
        "differenceFromAverage": 28252.8
      },
      {
        "categoryName": "Home Theater Projectors",
        "totalSales": 45004,
        "differenceFromAverage": 14631.2
      },
      {
        "categoryName": "Game Controllers",
        "totalSales": 43522,
        "differenceFromAverage": 13149.2
      },
      {
        "categoryName": "Remote Controls",
        "totalSales": 28946,
        "differenceFromAverage": 1426.8
      },
      {
        "categoryName": "VR Games",
        "totalSales": 32272,
        "differenceFromAverage": 1899.2
      }
    ]
  }
]