$unwind

Die $unwind-Phase im Aggregationsframework wird verwendet, um ein Arrayfeld aus den Eingabedokumenten zu dekonstrutieren und ein Dokument für jedes Element auszugeben. Jedes Ausgabedokument ist eine Kopie des Originals, jedoch mit dem Wert des Arrayfelds, das durch ein einzelnes Element ersetzt wird. Dies ist besonders nützlich für die Normalisierung von Daten, die in Arrays gespeichert sind, und zum Ausführen von separaten Vorgängen für jedes Element eines Arrays.

Syntax

{
  $unwind: {
    path: <field path>,
    includeArrayIndex: <string>, // Optional
    preserveNullAndEmptyArrays: <boolean> // Optional
  }
}

Die Parameter

Parameter Description
path Der Feldpfad zu einem Arrayfeld. Dies ist ein erforderlicher Parameter.
includeArrayIndex Wahlfrei. Der Name eines neuen Felds, das den Arrayindex des unwound-Elements enthält
preserveNullAndEmptyArrays Wahlfrei. Wenn „true“ angegeben ist und der Pfad null ist, fehlt oder ein leeres Array ist, gibt $unwind das Dokument unverändert aus.

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: Abwickeln von Verkäufen nach Kategorie

So dekonstruieren Sie das salesByCategory-Array im store-Dokument:

db.stores.aggregate([
  {
    $unwind: "$sales.salesByCategory"
  }
])

Die ersten beiden Ergebnisse, die von dieser Abfrage zurückgegeben werden, sind:

[
  {
    "_id": "7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5",
    "store": {
      "name": "Downtown Store",
      "sales": {
        "totalSales": 15000,
        "salesByCategory": {
          "category": "Electronics",
          "totalSales": 5000
        }
      }
    }
  },
  {
    "_id": "7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5",
    "store": {
      "name": "Downtown Store",
      "sales": {
        "totalSales": 15000,
        "salesByCategory": {
          "category": "Clothing",
          "totalSales": 10000
        }
      }
    }
  }
]

Beispiel 2: Abwickeln von Heraufstufungsereignissen mit Arrayindex

So dekonstruieren Sie das promotionEvents-Array und fügen den Arrayindex in die Ausgabe ein:

db.stores.aggregate([
  {
    $unwind: {
      path: "$promotionEvents",
      includeArrayIndex: "eventIndex"
    }
  }
])

Die ersten beiden Ergebnisse, die von dieser Abfrage zurückgegeben werden, sind:

[
  {
    "_id": "7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5",
    "store": {
      "name": "Downtown Store",
      "promotionEvents": {
        "eventName": "Summer Sale",
        "eventDate": ISODate("2024-08-01T00:00:00Z")
      },
      "eventIndex": 0
    }
  },
  {
    "_id": "7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5",
    "store": {
      "name": "Downtown Store",
      "promotionEvents": {
        "eventName": "Black Friday",
        "eventDate": ISODate("2024-11-25T00:00:00Z")
      },
      "eventIndex": 1
    }
  }
]

Beispiel 3: Abwickeln von Rabatten innerhalb von Pomotion-Ereignissen

So dekonstruieren Sie das discounts-Array innerhalb der einzelnen Promo-Ereignisse und behalten Dokumente ohne Rabatte bei:

db.stores.aggregate([
  {
    $unwind: {
      path: "$promotionEvents.discounts",
      preserveNullAndEmptyArrays: true
    }
  }
])

Die ersten beiden Ergebnisse, die von dieser Abfrage zurückgegeben werden, sind:

[
  {
    "_id": "7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5",
    "store": {
      "name": "Downtown Store",
      "promotionEvents": {
        "eventName": "Summer Sale",
        "discounts": {
          "discountType": "Percentage",
          "discountAmount": 20
        }
      }
    }
  },
  {
    "_id": "7954bd5c-9ac2-4c10-bb7a-2b79bd0963c5",
    "store": {
      "name": "Downtown Store",
      "promotionEvents": {
        "eventName": "Black Friday"
      }
    }
  }
]