2011-01-27 660 views

Respuesta

29

La forma más sencilla de realizar una operación de este tipo consiste en recorrer el conjunto de datos reasignando el nombre del campo. La forma más sencilla de hacerlo es escribir una función que realice la reescritura y luego utilizar la sintaxis .find().forEach() en el shell.

He aquí una muestra de la cáscara:

db.foo.save({ a : 1, b : 2, c : 3}); 
db.foo.save({ a : 4, b : 5, c : 6}); 
db.foo.save({ a : 7, b : 8 }); 
db.foo.find(); 

remap = function (x) { 
    if (x.c){ 
    db.foo.update({_id:x._id}, {$set:{d:x.c}, $unset:{c:1}}); 
    } 
} 

db.foo.find().forEach(remap); 
db.foo.find(); 

En el caso anterior que estoy haciendo un $unset y una $set en la misma acción. MongoDB no admite transacciones entre colecciones, pero lo anterior es un documento único. Así que está garantizado que el conjunto y el desarmado serán atómicos (, es decir, ambos tienen éxito o ambos fallan).

La única limitación aquí es que tendrá que administrar escritores externos para mantener la coherencia de los datos. Mi preferencia normal para esto es simplemente desactivar las escrituras mientras esto se actualiza. Si esta opción no está disponible, entonces tendrá que averiguar qué nivel de consistencia desea para los datos. (Puedo proporcionar algunas ideas aquí, pero que realmente va a ser específicos de sus datos y el sistema)

16
db.collection_name.update({}, {$rename: {"oldname": "newname"}}, false, true); 

Esto cambiará el nombre de la columna para cada fila de la colección.

Además, descubrí que si su columna (la que está cambiando de nombre) aparece dentro del catálogo de índice (db.collection_name.getIndexes()), entonces tendrá que soltar y volver a crear el índice (usando el nuevo nombre de columna) también.

+6

La pregunta explícitamente pregunta cómo lograr esto sin $ rename ... – samkass

+14

Aquí hay un error de sintaxis: el último '}' está fuera de lugar. Desea ejecutar 'db.collection_name.update ({}, {$ rename: {" oldname ":" newname "}}, false, true);'. – girasquid

+0

-1 esto no funciona en Mongo 1.6.5 – opyate

Cuestiones relacionadas