Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La fase $unwind del marco de agregación se usa para deconstruir un campo de matriz de los documentos de entrada para generar un documento para cada elemento. Cada documento de salida es una copia del original, pero con el valor del campo de matriz reemplazado por un solo elemento. Esto resulta especialmente útil para normalizar los datos almacenados en matrices y para realizar operaciones en cada elemento de una matriz por separado.
Syntax
{
$unwind: {
path: <field path>,
includeArrayIndex: <string>, // Optional
preserveNullAndEmptyArrays: <boolean> // Optional
}
}
Parámetros
| Parámetro | Description |
|---|---|
path |
Ruta de acceso de campo a un campo de matriz. Es un parámetro obligatorio. |
includeArrayIndex |
Optional. Nombre de un nuevo campo que contiene el índice de matriz del elemento desenredado. |
preserveNullAndEmptyArrays |
Optional. Si es true, si la ruta de acceso es null, falta o una matriz vacía, $unwind genera el documento sin cambios. |
Examples
Considere este documento de ejemplo de la colección de tiendas.
{
"_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
}
]
}
]
}
Ejemplo 1: Desenredar ventas por categoría
Para deconstruir la matriz salesByCategory en el documento de la tienda:
db.stores.aggregate([
{
$unwind: "$sales.salesByCategory"
}
])
Los dos primeros resultados devueltos por esta consulta son:
[
{
"_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
}
}
}
}
]
Ejemplo 2: Desenredar eventos de promoción con índice de matriz
Para deconstruir la matriz promotionEvents e incluir el índice de matriz en la salida:
db.stores.aggregate([
{
$unwind: {
path: "$promotionEvents",
includeArrayIndex: "eventIndex"
}
}
])
Los dos primeros resultados devueltos por esta consulta son:
[
{
"_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
}
}
]
Ejemplo 3: Desenredar descuentos en eventos de pomotion
Para deconstruir la matriz de descuentos dentro de cada evento de promoción y conservar documentos sin descuentos:
db.stores.aggregate([
{
$unwind: {
path: "$promotionEvents.discounts",
preserveNullAndEmptyArrays: true
}
}
])
Los dos primeros resultados devueltos por esta consulta son:
[
{
"_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"
}
}
}
]
Contenido relacionado
- Revise las opciones para migrar de MongoDB a Azure DocumentDB.
- Obtenga más información sobre la compatibilidad de características con MongoDB.