2011-01-27 10 views

risposta

29

Il modo più semplice per eseguire un'operazione di questo tipo consiste nel ricorrere al set di dati per ripetere la mappatura del nome del campo. Il modo più semplice per farlo è scrivere una funzione che esegua la riscrittura e quindi utilizzare la sintassi .find().forEach() nella shell.

Ecco un esempio dalla shell:

db.foo.save({ a : 1, b : 2, c : 3}); 
db.foo.save({ a : 4, b : 5, c : 6}); 
db.foo.save({ a : 7, b : 8 }); 
db.foo.find(); 

remap = function (x) { 
    if (x.c){ 
    db.foo.update({_id:x._id}, {$set:{d:x.c}, $unset:{c:1}}); 
    } 
} 

db.foo.find().forEach(remap); 
db.foo.find(); 

Nel caso di cui sopra che sto facendo un $unset e $set nella stessa azione. MongoDB non supporta le transazioni tra le raccolte, ma quanto sopra è un singolo documento. Pertanto, è garantito che il set e il unset saranno atomici (, ovvero entrambi hanno esito positivo oppure entrambi hanno esito negativo).

L'unica limitazione qui è che è necessario gestire gli autori esterni per mantenere i dati coerenti. La mia normale preferenza per questo è semplicemente di disattivare le scritture mentre questo si aggiorna. Se questa opzione non è disponibile, dovrai calcolare il livello di coerenza desiderato per i dati. (Posso fornire qualche idea qui, ma è davvero intenzione di essere specifico per i dati e il sistema)

16
db.collection_name.update({}, {$rename: {"oldname": "newname"}}, false, true); 

Ciò rinominare la colonna per ogni riga della collezione.

Inoltre, ho scoperto che se la tua colonna (quella che stai ridenominando) appare nel catalogo dell'indice (db.collection_name.getIndexes()), allora dovrai rilasciare e ricreare l'indice (usando il nome della nuova colonna) anche.

+6

La domanda chiede esplicitamente come eseguire questo senza $ rinominare ... – samkass

+14

C'è un errore di sintassi qui - l'ultimo '}' è posizionato male. Si desidera eseguire 'db.collection_name.update ({}, {$ rinominare: {" oldname ":" newname "}}, false, true);'. – girasquid

+0

-1 questo non funziona in Mongo 1.6.5 – opyate

Problemi correlati