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
$renamenu 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.