varios update relacionados insertar documentos consultas complejas comandos array actualizar mongodb

update - ¿Cómo puedo cambiar el nombre de un campo para todos los documentos en MongoDB?



update array mongodb (6)

Suponiendo que tengo una colección en MongoDB con 5000 registros, cada uno con algo similar a:

{ "occupation":"Doctor", "name": { "first":"Jimmy", "additional":"Smith" }

¿Existe alguna manera fácil de cambiar el nombre del campo "adicional" a "último" en todos los documentos? Vi el operador $rename en la documentación, pero no tengo muy claro cómo especificar un subcampo.


Cualquiera podría usar este comando para cambiar el nombre de un campo de la colección (Al no usar ningún _id):

dbName.collectionName.update({}, {$rename:{"oldFieldName":"newFieldName"}}, false, true);

ver FYI


Este código de nodo simplemente hace eso, como @Felix Yan mencionó, la forma anterior parece funcionar bien, tuve algunos problemas con otros snipets, espero que esto ayude.

Esto cambiará el nombre de la columna "oldColumnName" para que sea "newColumnName" de los "documentos" de la tabla

var MongoClient = require(''mongodb'').MongoClient , assert = require(''assert''); // Connection URL //var url = ''mongodb://localhost:27017/myproject''; var url = ''mongodb://myuser:[email protected]:portNumber/databasename''; // Use connect method to connect to the server MongoClient.connect(url, function(err, db) { assert.equal(null, err); console.log("Connected successfully to server"); renameDBColumn(db, function() { db.close(); }); }); // // This function should be used for renaming a field for all documents // var renameDBColumn = function(db, callback) { // Get the documents collection console.log("renaming database column of table documents"); //use the former way: remap = function (x) { if (x.oldColumnName){ db.collection(''documents'').update({_id:x._id}, {$set:{"newColumnName":x.oldColumnName}, $unset:{"oldColumnName":1}}); } } db.collection(''documents'').find().forEach(remap); console.log("db table documents remap successfully!"); }


Estoy usando, Mongo 3.4.0

El operador $ rename actualiza el nombre de un campo y tiene la siguiente forma:

{$rename: { <field1>: <newName1>, <field2>: <newName2>, ... } }

por ejemplo

db.getCollection(''user'').update( { _id: 1 }, { $rename: { ''fname'': ''FirstName'', ''lname'': ''LastName'' } } )

El nuevo nombre de campo debe diferir del nombre de campo existente. Para especificar un documento incrustado, use notación de puntos.

Esta operación cambia el nombre del campo nmae por el nombre de todos los documentos en la colección:

db.getCollection(''user'').updateMany( {}, { $rename: { "add": "Address" } } ) db.getCollection(''user'').update({}, {$rename:{"name.first":"name.FirstName"}}, false, true);

En el método anterior falso, true son: {upsert: false, multi: true}. Para actualizar todos tus registros, necesitas el multi: true.

Cambiar el nombre de un campo en un documento incrustado

db.getCollection(''user'').update( { _id: 1 }, { $rename: { "name.first": "name.fname" } } )

utilice el enlace: FYI


Puedes usar:

db.foo.update({}, {$rename:{"name.additional":"name.last"}}, false, true);

O simplemente actualice los documentos que contienen la propiedad:

db.foo.update({"name.additional": {$exists: true}}, {$rename:{"name.additional":"name.last"}}, false, true);

Lo false, true en el método anterior son: { upsert:false, multi:true } . Necesita el multi:true para actualizar todos sus registros.

O puede usar la forma anterior:

remap = function (x) { if (x.additional){ db.foo.update({_id:x._id}, {$set:{"name.last":x.name.additional}, $unset:{"name.additional":1}}); } } db.foo.find().forEach(remap);

En MongoDB 3.2 también puedes usar

db.students.updateMany( {}, { $rename: { "oldname": "newname" } } )

La sintaxis general de esto es

db.collection.updateMany(filter, update, options)

https://docs.mongodb.com/manual/reference/method/db.collection.updateMany/


Si alguna vez necesitas hacer lo mismo con mongoid:

Model.all.rename(:old_field, :new_field)

ACTUALIZAR

Hay un cambio en la sintaxis en monogoid 4.0.0 :

Model.all.rename(old_field: :new_field)