2011-05-31 7 views
8

Utilizzando la shell mongodb, sto tentando di aggiungere una nuova proprietà a ciascun documento in una raccolta di grandi dimensioni. La collezione (Listing) ha una proprietà esistente chiamata Address. Sto semplicemente cercando di aggiungere una nuova proprietà chiamata LowerCaseAddress che può essere utilizzata per la ricerca in modo che non sia necessario utilizzare espressioni regolari non sensibili alle maiuscole e minuscole per la corrispondenza degli indirizzi, che è lenta.Aggiunta di una nuova proprietà a ciascun documento in una grande raccolta

Ecco lo script ho provato ad usare nella shell:

for(var c = db.Listing.find(); c.hasNext();) { 
    var listing = c.next(); 
    db.Listing.update({ LowerCaseAddress: listing.Address.toLowerCase() }); 
} 

Ha funzionato per ~ 6 ore e poi il mio PC si è schiantato. Esiste un modo migliore per aggiungere una nuova proprietà a ciascun documento in una raccolta di grandi dimensioni (~ 4 milioni di record)?

+0

Sembra che si sta perdendo alcuni parametri L'aggiornamento e - non si dispone di un criterio quindi potrebbe tentare di aggiornare tutti registra su ogni iterazione del ciclo. (Non sono sicuro di come si comporta mongo se non si imposta un criterio per l'aggiornamento) –

+0

javascript qui non funziona. Dai un'occhiata alla risposta di Sid Burn. Inoltre, se devi aggiornare molti e molti documenti, probabilmente lo vuoi fare in batch per evitare il blocco e avere un checkpoint per il progresso nel caso in cui qualcosa non funzioni. –

risposta

17

JavaScript non ha funzionato, ma il codice di sotto funziona. Ma non sapevo quanto tempo ci vuole per 4 milioni di dischi.

db.Listing.find().forEach(function(item){ 
    db.Listing.update({_id: item._id}, {$set: { LowerCaseAddress: item.Address.toLowerCase() }}) 
}) 
+0

Questa richiesta ha richiesto un po 'di tempo ma ha funzionato, grazie !! – Justin

1

È possibile utilizzare updateMany anche per questo:

try { db.<collection>.updateMany({}, {$set: { LowerCaseAddress: item.Address.toLowerCase() } }); } catch(e) { print(e); }

Problemi correlati