Compartilhar via


$push

O $push operador é usado para adicionar um valor especificado a uma matriz dentro de um documento. O operador $push adiciona novos elementos a uma matriz existente sem afetar outros elementos na matriz.

Sintaxe

db.collection.update({
    < query >
}, {
    $push: {
        < field >: < value >
    }
}, {
    < options >
})

Parâmetros

Parâmetro Description
<query> Os critérios de seleção para os documentos a serem atualizados.
<field> O campo de matriz ao qual o valor será acrescentado.
<value> O valor a ser acrescentado ao campo de matriz.
<options> Optional. Opções adicionais para a operação de atualização.

Exemplos

Considere este documento de exemplo da coleção de documentos das lojas.

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

Exemplo 1 – Adicionar uma nova categoria de vendas

Para adicionar uma nova categoria de vendas à matriz salesByCategory, execute uma consulta usando o operador $push no campo com um novo objeto Sales com o nome da categoria e seu volume de vendas.

db.stores.update({
    _id: "0fcc0bf0-ed18-4ab8-b558-9848e18058f4"
}, {
    $push: {
        "sales.salesByCategory": {
            categoryName: "Wine Accessories",
            totalSales: 1000.00
        }
    }
})

Essa consulta retorna o seguinte resultado:

[
  {
    "acknowledged": true,
    "insertedId": null,
    "matchedCount": "1",
    "modifiedCount": "1",
    "upsertedCount": 0
  }
]

Exemplo 2 - Usar $push com $setWindowFields

Para recuperar os volumes de vendas distintos em todas as lojas da empresa "First Up Consultants", primeiro execute uma consulta para particionar as lojas dentro da empresa. Em seguida, use o operador $push para criar uma lista de vendas do primeiro repositório até o atual dentro da partição.

db.stores.aggregate([{
    $match: {
        company: {
            $in: ["First Up Consultants"]
        }
    }
}, {
    $setWindowFields: {
        partitionBy: "$company",
        sortBy: {
            "sales.totalSales": -1
        },
        output: {
            salesByStore: {
                $push: "$sales.totalSales",
                window: {
                    documents: ["unbounded", "current"]
                }
            }
        }
    }
}, {
    $project: {
        company: 1,
        salesByStore: 1
    }
}])

Os três primeiros resultados retornados por esta consulta são:

[
    {
        "_id": "a0386810-b6f8-4b05-9d60-e536fb2b0026",
        "company": "First Up Consultants",
        "salesByStore": [
            327583
        ]
    },
    {
        "_id": "ad8af64a-d5bb-4162-9bb6-e5104126566d",
        "company": "First Up Consultants",
        "salesByStore": [
            327583,
            288582
        ]
    },
    {
        "_id": "39acb3aa-f350-41cb-9279-9e34c004415a",
        "company": "First Up Consultants",
        "salesByStore": [
            327583,
            288582,
            279183
        ]
    }
]