Condividi tramite


$reduce (espressione di matrice)

SI APPLICA A: MongoDB vCore

L'operatore $reduce viene usato per applicare un'espressione a ogni elemento di una matrice e accumulare i risultati in un singolo valore. Questo operatore è particolarmente utile per eseguire operazioni che richiedono l'iterazione sugli elementi della matrice e l'aggregazione dei relativi valori.

Sintassi

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

Parametri

Descrizione
input Matrice su cui eseguire l'iterazione.
initialValue Valore cumulativo iniziale impostato prima dell'inizio dell'iterazione della matrice.
in Espressione valida che restituisce il valore accumulato per ogni elemento nella matrice.

Esempio

Si esaminerà ora l'utilizzo con json di esempio dal stores set di dati.

{
  "_id": "d3c9df51-41bd-4b4e-a26b-b038d9cf8b45",
  "location": {
    "lat": -67.7571,
    "lon": 97.2505
  },
  "sales": {
    "totalSales": 149849,
    "salesByCategory": [
      {
        "categoryName": "DJ Speakers",
        "totalSales": 36972
      },
      {
        "categoryName": "DJ Headphones",
        "totalSales": 12877
      },
      {
        "categoryName": "Music Accessories",
        "totalSales": 40000
      },
      {
        "categoryName": "DJ Accessories",
        "totalSales": 60000
      }
    ]
  },
  "tag": [
    "#ShopLocal",
    "#FashionStore",
    "#SeasonalSale",
    "#FreeShipping",
    "#MembershipDeals"
  ]
}

Esempio 1: Aggrega i valori della matrice

Nell'esempio viene illustrato come usare $reduce per sommare le vendite totali tra categorie diverse nella salesByCategory matrice.

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

La query restituisce totalSales tra le categorie.

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