partir de la versión 3.4, podemos usar el operador de canalización $addFields
agregación a esta sin procesamiento del lado del cliente que es el más eficiente camino.
db.collection.aggregate(
[
{ "$addFields": { "field2": "$field1" }},
{ "$out": "collection" }
]
)
Antes de la versión 3.4 tenemos que recorrer el objeto Cursor
y utilizar $set
operador para añadir el nuevo campo con el valor "campo1" existente. Debe hacer esto usando la operación "bulk" para la máxima eficiencia.
MongoDB 3.2 rechaza Bulk()
y su associated methods, por lo tanto, desde 3.2 hacia arriba, necesita utilizar el método bulkWrite
.
var requests = [];
db.collection.find({}, { 'field1': 1 }).snapshot().forEach(document => {
requests.push({
'updateOne': {
'filter': { '_id': document._id },
'update': { '$set': { 'field2': document.field1 } }
}
});
if (requests.length === 1000) {
//Execute per 1000 operations and re-init
db.collection.bulkWrite(requests);
requests = [];
}
});
if(requests.length > 0) {
db.collection.bulkWrite(requests);
}
Desde la versión 2.6 a 3.0, puede utilizar la API Bulk
.
var bulk = db.collection.initializeUnorderedBulOp();
var count = 0;
db.collection.find({}, { 'field1': 1 }).snapshot().forEach(function(document) {
bulk.find({ '_id': document._id }).updateOne({
'$set': { 'field2': document.field1 }
});
count++;
if(count%1000 === 0) {
// Excecute per 1000 operations and re-init
bulk.execute();
bulk = db.collection.initializeUnorderedBulkOp();
}
})
// clean up queues
if(count > 0) {
bulk.execute();
}
pregunta muy similar: http://stackoverflow.com/questions/3974985/update-mongodb-field-using-value-of-another-field/ –