¿Cómo puedo cambiar el nombre de un campo para todos los documentos en MongoDB?
Asumiendo que tengo una colección en MongoDB con 5000 registros, cada uno conteniendo algo similar a:
{
"occupation":"Doctor",
"name": {
"first":"Jimmy",
"additional":"Smith"
}
¿Hay una manera fácil de cambiar el nombre del campo "adicional" a "último" en todos los documentos? Vi el operador rename rename en la documentación, pero no tengo muy claro cómo especificar un subcampo.
6 answers
Puedes usar:
db.foo.update({}, {$rename:{"name.additional":"name.last"}}, false, true);
O simplemente actualizar los documentos que contienen la propiedad:
db.foo.update({"name.additional": {$exists: true}}, {$rename:{"name.additional":"name.last"}}, false, true);
El false, true
en el método anterior son: { upsert:false, multi:true }
. Necesita el multi:true
para actualizar todos sus registros.
O puedes 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 /
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-13 18:37:10
Por favor, inténtalo
db.collectionName.update({}, { $rename : { 'name.additional' : 'name.last' } }, { multi: true } )
Y lea esto :) http://docs.mongodb.org/manual/reference/operator/rename/#_S_rename
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-14 13:45:56
Si alguna vez necesitas hacer lo mismo con mongoid:
Model.all.rename(:old_field, :new_field)
UPDATE
Hay un cambio en la sintaxis en monogoid 4.0.0
:
Model.all.rename(old_field: :new_field)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-30 16:43:51
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);
Véase PARA SU información
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-20 12:39:49
Este código de nodejs simplemente hacer 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" a "newColumnName" de la tabla "documents"
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!");
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-24 03:48:46
Estoy usando ,Mongo 3.4.0
El operador rename 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 a en un documento incrustado, utilice la notación de puntos.
Esta operación cambia el nombre del campo nmae para nombrar todos los documentos de 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 false, true son: { upsert: false, multi:true}. Para actualizar todos sus 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" } } )
Use enlace: https://docs.mongodb.com/manual/reference/operator/update/rename /
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-04 08:59:29