Dela via


$zip (matrisuttryck)

GÄLLER FÖR: MongoDB vCore

Operatorn $zip används för att sammanfoga två eller flera matriser elementmässigt till en enda matris med matriser. Det är användbart när du vill kombinera relaterade element från flera matriser till en enda matrisstruktur.

Syntax

Syntaxen för operatorn $zip är följande:

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

Parametrar

beskrivning
inputs En matris med matriser som ska sammanfogas elementmässigt.
useLongestLength Ett booleskt värde som, om det är inställt på true, använder den längsta längden på indatamatriserna. Om falskt eller inte anges används den kortaste längden.
defaults En matris med standardvärden som ska användas om useLongestLength är true och en indatamatris är kortare än den längsta matrisen.

Exempel

Nu ska vi förstå användningen med exempel-json från stores datauppsättningen.

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

Exempel 1: Grundläggande användning

Anta att du vill sammanfoga fälten categoryName och totalSales från matrisen salesByCategory .

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
        }
      }
    }
  }
])

Detta skapar utdata för enskilda matriser med matriser under categoryWithSales fält. useLongestLength inställd på true returnerar följande utdata, medan ett värde för false tar bort matrisen Napkins från utdata.

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