$zip(数组表达式)

适用对象: MongoDB vCore

$zip 运算符用于将两个或多个数组元素合并为一个数组。 如果要将多个数组中的相关元素合并到单个数组结构中,这非常有用。

语法

$zip 运算符的语法如下所示:

{
  $zip: {
    inputs: [ <array1>, <array2>, ... ],
    useLongestLength: <boolean>, // Optional
    defaults: <array> // Optional
  }
}

参数

说明
inputs 要按元素合并的数组数组。
useLongestLength 一个布尔值,如果设置为 true,则使用输入数组的最长长度。 如果为 false 或未指定,则使用最短长度。
defaults 如果为 useLongestLength true,并且任何输入数组都短于最长数组,则使用默认值数组。

示例

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

{
  "_id": "988d2dd1-2faa-4072-b420-b91b95cbfd60",
  "name": "Lakeshore Retail",
  "location": {
    "lat": -51.3041,
    "lon": -166.0838
  },
  "staff": {
    "totalStaff": {
      "fullTime": 5,
      "partTime": 20
    }
  },
  "sales": {
    "totalSales": 266491,
    "salesByCategory": [
      {
        "categoryName": "Towel Racks",
        "totalSales": 13237
      },
      {
        "categoryName": "Washcloths",
        "totalSales": 44315
      },
      {
        "categoryName": "Face Towels",
        "totalSales": 42095
      },
      {
        "categoryName": "Toothbrush Holders",
        "totalSales": 47912
      },
      {
        "categoryName": "Hybrid Mattresses",
        "totalSales": 48660
      },
      {
        "categoryName": "Napkins"
      },
      {
        "categoryName": "Pillow Cases",
        "totalSales": 38833
      }
    ]
  }
}

示例 1:基本用法

假设你想要合并 salesByCategory 数组中的 categoryNametotalSales 字段。

db.stores.aggregate([
  { $match: {"_id": "988d2dd1-2faa-4072-b420-b91b95cbfd60"} },
  {
    $project: {
      name:1,
      categoryNames: "$sales.salesByCategory.categoryName",
      totalSales: "$sales.salesByCategory.totalSales",
      categoryWithSales: {
        $zip: {
          inputs: ["$sales.salesByCategory.categoryName", "$sales.salesByCategory.totalSales"],
          useLongestLength: false
        }
      }
    }
  }
])

这将为 categoryWithSales 字段下的单个数组生成输出。 useLongestLength 设置为 true 将返回以下输出,而值 false 将从输出中删除 Napkins 数组。

{
  "_id": "988d2dd1-2faa-4072-b420-b91b95cbfd60",
  "name": "Lakeshore Retail",
  "categoryNames": [
    "Towel Racks",
    "Washcloths",
    "Face Towels",
    "Toothbrush Holders",
    "Hybrid Mattresses",
    "Napkins",
    "Pillow Cases"
  ],
  "totalSales": [
    13237, 44315,
    42095, 47912,
    48660, 38833
  ],
  "categoryWithSales": [
    ["Towel Racks", 13237],
    ["Washcloths", 44315],
    ["Face Towels", 42095],
    ["Toothbrush Holders", 47912],
    ["Hybrid Mattresses", 48660],
    ["Napkins", null],
    ["Pillow Cases", 38833]
  ]
}