$rename în MongoDB & NoSQL

Operatorul $rename schimbă numele unui câmp în documente, inclusiv mutarea lui dintr-un subdocument la nivelul principal.

Sintaxă
{ $rename: { <camp>: <numeNou>, ... } }

Ce face $rename

$rename redenumește câmpuri fără să le schimbe valoarea. Este util la migrări de schemă: de exemplu, toate documentele care au telefon trebuie să aibă de acum tel. Documentele care nu au câmpul vechi rămân neschimbate.

Intern, operația este un $unset pe numele vechi și un $set pe cel nou, așa că în document câmpul se poate muta la final. Cu notația cu punct poți muta câmpuri din și în subdocumente ('adresa.oras' → 'oras'). Dacă numele nou există deja, valoarea lui este suprascrisă.

Parametri

Parametru Descriere
<camp> Numele actual (acceptă notația cu punct).
<numeNou> Numele nou; trebuie să fie diferit de cel vechi.

Ce returnează

Rezultatul obișnuit al unui update: matchedCount și modifiedCount.

Exemple

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

use magazin
db.clienti.insertMany([
  { _id: 1, nume: 'Ana', telefon: '0722000111', adresa: { oras: 'Iași', strada: 'Lăpușneanu 10' } },
  { _id: 2, nume: 'Dan', adresa: { oras: 'Cluj' } }
])

Exemplul 1: Redenumirea câmpului telefon în toată colecția

Ambele documente se potrivesc filtrului gol, dar doar Ana avea telefon, deci doar unul este modificat.

db.clienti.updateMany({}, { $rename: { telefon: 'tel' } })

Ieșire în mongosh

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

Exemplul 2: Câmpul nou apare la final

După exemplul 1, tel este acum ultimul câmp al documentului.

db.clienti.findOne({ _id: 1 })

Ieșire în mongosh

{
  _id: 1,
  nume: 'Ana',
  adresa: { oras: 'Iași', strada: 'Lăpușneanu 10' },
  tel: '0722000111'
}

Exemplul 3: Mutarea orașului din subdocument

Subdocumentul adresa rămâne, gol.

db.clienti.findOneAndUpdate({ _id: 2 }, { $rename: { 'adresa.oras': 'oras' } }, { returnDocument: 'after' })

Ieșire în mongosh

{ _id: 2, nume: 'Dan', adresa: {}, oras: 'Cluj' }

Greșeli frecvente

  • $rename nu funcționează pe elemente din tablouri ('produse.0.nume'); pentru ele folosește un update cu pipeline sau o actualizare în aplicație.
  • Dacă numele nou există deja, valoarea veche a lui se pierde fără avertisment.
  • Codul aplicației care citește câmpul vechi trebuie schimbat în același timp cu migrarea.

Comenzi înrudite

  • $min / $max (update): La actualizare, $min scrie valoarea doar dacă e mai mică decât cea existentă, iar $max doar dacă e mai mare.
  • $currentDate: Operatorul $currentDate pune în câmp data și ora serverului în momentul actualizării, ca Date sau ca Timestamp.
  • replaceOne(): Înlocuiește complet primul document găsit cu un document nou; câmpurile care nu apar în documentul nou dispar.
  • $addFields / $set: Etapa $addFields (alias $set) adaugă câmpuri calculate sau suprascrie câmpuri existente, păstrând restul documentului.