$min / $max (update) în MongoDB & NoSQL

La actualizare, $min scrie valoarea doar dacă e mai mică decât cea existentă, iar $max doar dacă e mai mare.

Sintaxă
{ $min: { <camp>: <valoare> } }
{ $max: { <camp>: <valoare> } }

Ce face $min / $max (update)

$min compară valoarea dată cu valoarea curentă a câmpului și o scrie doar dacă este mai mică. $max o scrie doar dacă este mai mare. Dacă documentul nu are câmpul, acesta este creat cu valoarea dată. Ambii operatori există din MongoDB 2.6.

Sunt potriviți pentru recorduri și limite: prețul minim văzut vreodată, nota maximă a unui elev, prima și ultima vizită (merg și cu date calendaristice). Comparația este atomică, deci nu ai nevoie să citești întâi documentul.

Parametri

Parametru Descriere
$min Scrie doar dacă valoarea nouă < valoarea curentă.
$max Scrie doar dacă valoarea nouă > valoarea curentă.

Ce returnează

Rezultatul obișnuit al unui update; modifiedCount: 0 dacă nicio valoare nu a fost schimbată.

Exemple

Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.

use magazin
db.produse.insertOne({ _id: 'caiet', pretMinim: 12, pretMaxim: 15, stoc: 40 })

Exemplul 1: Actualizarea intervalului de preț

10 < 12, deci pretMinim se schimbă; 14 nu e mai mare decât 15, deci pretMaxim rămâne.

db.produse.findOneAndUpdate({ _id: 'caiet' }, { $min: { pretMinim: 10 }, $max: { pretMaxim: 14 } }, { returnDocument: 'after' })

Ieșire în mongosh

{ _id: 'caiet', pretMinim: 10, pretMaxim: 15, stoc: 40 }

Exemplul 2: Nicio schimbare

Pornind de la datele inițiale, ambele valori sunt „mai proaste” decât cele salvate, așa că documentul nu este modificat.

db.produse.updateOne({ _id: 'caiet' }, { $min: { pretMinim: 13 }, $max: { pretMaxim: 15 } })

Ieșire în mongosh

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

Exemplul 3: Ultima vânzare a unui produs

Câmpul nu exista, deci este creat. Cu date calendaristice, $max păstrează cea mai recentă dată, chiar dacă evenimentele vin în altă ordine.

db.produse.updateOne({ _id: 'caiet' }, { $max: { ultimaVanzare: new Date('2026-10-25T09:30:00Z') } })

Ieșire în mongosh

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

Greșeli frecvente

  • Nu confunda $min/$max de la update cu acumulatorii $min/$max din $group: aceleași nume, alt rol.
  • Dacă tipurile diferă (număr salvat ca text '12'), comparația folosește ordinea tipurilor BSON, nu valoarea numerică: rezultatul te poate surprinde.

Comenzi înrudite

  • $rename: Operatorul $rename schimbă numele unui câmp în documente, inclusiv mutarea lui dintr-un subdocument la nivelul principal.
  • $currentDate: Operatorul $currentDate pune în câmp data și ora serverului în momentul actualizării, ca Date sau ca Timestamp.
  • $group: Etapa $group grupează documentele după o cheie și calculează totaluri: $sum, $avg, $min, $max, $push, $addToSet.