你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

$reduce (数组表达式)

适用对象: MongoDB vCore

$reduce 运算符用于将表达式应用于数组中的每个元素,并将结果累积到单个值中。 此运算符特别适用于执行需要循环访问数组元素并聚合其值的操作。

语法

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

parameters

说明
input 要循环访问的数组。
initialValue 数组迭代开始前设置的初始累积值。
in 一个计算结果为数组中每个元素的累积值的有效表达式。

示例

让我们了解数据集 stores 中示例 json 的用法。

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

示例 1:聚合数组值

该示例演示如何用于 $reduce 对数组中 salesByCategory 不同类别的总销售额求和。

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

查询会 totalSales 跨类别返回。

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