Compartilhar via


findAndModify

O findAndModify comando é usado para modificar e retornar atomicamente um único documento. Esse comando é útil para operações que exigem ler e atualizar um documento em uma única etapa, garantindo a consistência dos dados. Casos de uso comuns incluem a implementação de contadores, filas e outras operações atômicas.

Sintaxe

A sintaxe do comando é a findAndModify seguinte:

db.collection.findAndModify({
   query: <document>,
   sort: <document>,
   remove: <boolean>,
   update: <document>,
   new: <boolean>,
   fields: <document>,
   upsert: <boolean>
})

Parâmetros

  • consulta: os critérios de seleção para o documento a ser modificado.
  • classificação: Determina qual documento modificar se a consulta selecionar vários documentos.
  • remove: Se true, remove o documento selecionado.
  • atualização: as modificações a serem aplicadas.
  • new: If true, retorna o documento modificado em vez do original.
  • campos: limita os campos a serem retornados para o documento correspondente.
  • upsert: Se true, criará um novo documento se nenhum documento corresponder à consulta.

Exemplos

Exemplo 1: atualizar o total de vendas

Suponha que queremos atualizar o total de vendas da loja com _id "e5767a9f-cd95-439c-9ec4-7ddc13d22926" 550000.00 e retornar o documento atualizado.

db.stores.findAndModify({
   query: { "_id": "e5767a9f-cd95-439c-9ec4-7ddc13d22926" },
   update: { $set: { "sales.totalSales": 550000.00 } },
   new: true
})

Saída de exemplo

{
  "_id": "e5767a9f-cd95-439c-9ec4-7ddc13d22926",
  "name": "Marina's Eyewear Bargains",
  "location": { "lat": -87.4376, "lon": 42.2928 },
  "staff": { "totalStaff": { "fullTime": 20, "partTime": 6 } },
  "sales": {
    "totalSales": 550000,
    "salesByCategory": [
      { "categoryName": "Round Sunglasses", "totalSales": 39621 },
      { "categoryName": "Reading Glasses", "totalSales": 1146 },
      { "categoryName": "Aviators", "totalSales": 9385 }
    ]
  },
  "promotionEvents": [
    {
      "eventName": "Incredible Discount Days",
      "promotionalDates": {
        "startDate": { "Year": 2024, "Month": 2, "Day": 11 },
        "endDate": { "Year": 2024, "Month": 2, "Day": 18 }
      },
      "discounts": [
        { "categoryName": "Square Sunglasses", "discountPercentage": 16 },
        { "categoryName": "Safety Glasses", "discountPercentage": 17 },
        { "categoryName": "Wayfarers", "discountPercentage": 7 },
        { "categoryName": "Eyewear Accessories", "discountPercentage": 12 }
      ]
    }
],
  "tag": [
    "#ShopLocal",
    "#FashionStore",
    "#SeasonalSale",
    "#FreeShipping",
    "#MembershipDeals"
  ]
}

Exemplo 2: Adicionar um novo evento promocional

Vamos adicionar um novo evento promocional chamado "Electronics Super Saver" à loja com _id_ "e5767a9f-cd95-439c-9ec4-7ddc13d22926" e retornar o documento atualizado.

db.stores.findAndModify({
   query: { "_id": "e5767a9f-cd95-439c-9ec4-7ddc13d22926" },
   update: { $push: { "promotionEvents": {
       "eventName": "Electronics Super Saver",
       "promotionalDates": {
         "startDate": "2025-09-31",
         "endDate": "2025-09-31"
       },
       "discounts": [
         {
           "categoryName": "Laptops",
           "discountPercentage": 45
         },
         {
           "categoryName": "Smartphones",
           "discountPercentage": 25
         }
       ]
   }}},
   new: true
})

Saída de exemplo

{
  "_id": "e5767a9f-cd95-439c-9ec4-7ddc13d22926",
  "name": "Marina's Eyewear Bargains",
  "location": { "lat": -87.4376, "lon": 42.2928 },
  "staff": { "totalStaff": { "fullTime": 20, "partTime": 6 } },
  "sales": {
    "totalSales": 550000,
    "salesByCategory": [
      { "categoryName": "Round Sunglasses", "totalSales": 39621 },
      { "categoryName": "Reading Glasses", "totalSales": 1146 },
      { "categoryName": "Aviators", "totalSales": 9385 }
    ]
  },
  "promotionEvents": [
    {
      "eventName": "Electronics Super Saver",
      "promotionalDates": { "startDate": "2025-09-31", "endDate": "2025-09-31" },
      "discounts": [
        { "categoryName": "Laptops", "discountPercentage": 45 },
        { "categoryName": "Smartphones", "discountPercentage": 25 }
      ]
    }
  ],
  "tag": [
    "#ShopLocal",
    "#FashionStore",
    "#SeasonalSale",
    "#FreeShipping",
    "#MembershipDeals"
  ]
}

Exemplo 3: remover um evento promocional

Suponha que queremos remover o evento promocional "Electronics Super Saver" da loja com _id "e5767a9f-cd95-439c-9ec4-7ddc13d22926" e retornar o documento original.

db.stores.findAndModify({
   query: { "_id": "e5767a9f-cd95-439c-9ec4-7ddc13d22926" },
   update: { $pull: { "promotionEvents": { "eventName": "Electronics Super Saver" } } },
   new: true
})

Saída de exemplo

{
  "_id": "e5767a9f-cd95-439c-9ec4-7ddc13d22926",
  "name": "Marina's Eyewear Bargains",
  "location": { "lat": -87.4376, "lon": 42.2928 },
  "staff": { "totalStaff": { "fullTime": 20, "partTime": 6 } },
  "sales": {
    "totalSales": 550000,
    "salesByCategory": [
      { "categoryName": "Round Sunglasses", "totalSales": 39621 },
      { "categoryName": "Reading Glasses", "totalSales": 1146 },
      { "categoryName": "Aviators", "totalSales": 9385 }
    ]
  },
  "promotionEvents": [
    {
      "eventName": "Incredible Discount Days",
      "promotionalDates": {
        "startDate": { "Year": 2024, "Month": 2, "Day": 11 },
        "endDate": { "Year": 2024, "Month": 2, "Day": 18 }
      },
      "discounts": [
        { "categoryName": "Square Sunglasses", "discountPercentage": 16 },
        { "categoryName": "Safety Glasses", "discountPercentage": 17 },
        { "categoryName": "Wayfarers", "discountPercentage": 7 },
        { "categoryName": "Eyewear Accessories", "discountPercentage": 12 }
      ]
    }
  ],
  "tag": [
    "#ShopLocal",
    "#FashionStore",
    "#SeasonalSale",
    "#FreeShipping",
    "#MembershipDeals"
  ]
}