mongodb - que - Actualizar el campo con el valor de otro campo en el documento
mongodb español (3)
A partir de la versión 3.4, podemos usar el operador de canalización de agregación $addFields
sin procesamiento del lado del cliente, que es la forma más eficiente.
db.collection.aggregate(
[
{ "$addFields": { "field2": "$field1" }},
{ "$out": "collection" }
]
)
Antes de la versión 3.4, necesitamos iterar el objeto Cursor
y usar $set
operator para agregar el nuevo campo con el valor "field1" existente. Debe hacer esto usando la operación "bulk" para la máxima eficiencia.
MongoDB 3.2 desaprueba Bulk()
y sus métodos asociados, por lo tanto de 3.2 hacia arriba necesita usar 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 la 3.0, puedes usar 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();
}
Esta pregunta ya tiene una respuesta aquí:
Tengo una colección t1
con los siguientes campos en su esquema
_id, field1, field1
Quiero establecer el campo de field2
como sql:
update t1 set field1=field2;
¿Cómo lo hago en MongoDB?
Buenas y malas noticias aquí.
Las malas noticias son que AFAIK no puede hacerlo con una sola llamada a update () - mongo no admite la referencia al objeto actual en la actualización.
La buena noticia es que hay otras maneras de hacerlo, por ejemplo, puede ejecutar un bucle de cada ciclo:
db.item.find(conditions...).forEach( function (doc) {
doc.field1 = doc.field2;
db.item.save(doc);
});
Puede ejecutar para cada uno en el shell de administrador (comando ''mongo''), o mediante algunos de los métodos de su controlador específico (por ejemplo, en PHP esperaría que funcione con mongodb.execute () como se describe aquí: http://www.php.net/manual/en/mongodb.execute.php )
Esto se puede hacer a través de:
db.nameOfCollection.find().forEach(
function (elem) {
db.nameOfCollection.update(
{
_id: elem._id
},
{
$set: {
field2: elem.field1
}
}
);
}
);