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)
intente con db.collectionName.update({}, { $rename : { ''name.additional'' : ''name.last'' } }, { multi: true } )
y lea esto :) http://docs.mongodb.org/manual/reference/operator/rename/#_S_rename