Freigeben über


$reduce

Der $reduce Operator wird verwendet, um einen Ausdruck auf jedes Element in einem Array anzuwenden und die Ergebnisse in einem einzelnen Wert zu sammeln. Dieser Operator ist nützlich zum Ausführen von Vorgängen, die das Durchlaufen von Arrayelementen und das Aggregieren ihrer Werte erfordern.

Syntax

$reduce: {
   input: <array>,
   initialValue: <expression>,
   in: <expression>
}

Die Parameter

Parameter Description
input Das Array, das durchlaufen werden soll.
initialValue Der anfängliche kumulierte Wert, der vor Beginn der Arrayiteration festgelegt wurde.
in Ein gültiger Ausdruck, der den akkumulierten Wert für jedes Element im Array auswertet.

Examples

Betrachten Sie dieses Beispieldokument aus der Stores-Sammlung.

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

Beispiel 1: Aggregiert die Arraywerte

Diese Abfrage veranschaulicht, wie $reduce Sie den Gesamtumsatz in verschiedenen Kategorien im salesByCategory Array addieren.

db.stores.aggregate([{
    $match: {
        _id: "988d2dd1-2faa-4072-b420-b91b95cbfd60"
    }
}, {
    $project: {
        totalSalesByCategory: {
            $reduce: {
                input: "$sales.salesByCategory.totalSales",
                initialValue: 0,
                in: {
                    $add: ["$$value", "$$this"]
                }
            }
        }
    }
}])

Die Abfrage gibt das folgende Ergebnis zurück.

[
  {
      "_id": "988d2dd1-2faa-4072-b420-b91b95cbfd60",
      "totalSalesByCategory": 149849
  }
]