ventajas que español desventajas caracteristicas mongodb mongodb-query

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 } } ); } );