Tant que vous êtes OK avec la création d'une copie des données, l'agrégation cadre peut être utilisé comme une alternative ici. Vous avez également la possibilité de faire plus de données si vous souhaitez utiliser d'autres opérateurs, mais le seul que vous avez besoin est - $project
. C'est un peu du gaspillage en termes d'espace, mais peut être plus rapide et plus appropriée pour certaines utilisations. Pour illustrer, je vais d'abord insérer des données de l'échantillon en foo
collection:
db.foo.insert({ 'lat': 1, 'lon': 2, someotherdata : [1, 2, 3] })
db.foo.insert({ 'lat': 4, 'lon': 1, someotherdata : [4, 5, 6] })
Maintenant, nous utiliserons $project
de retravailler l' lat
et lon
champs, puis les envoyer à l' newfoo
collection:
db.foo.aggregate([
{$project : {_id : "$_id", "coords.lat" : "$lat", "coords.lon" : "$lon", "someotherdata" : "$someotherdata" }},
{ $out : "newfoo" }
])
Ensuite, vérifiez newfoo
de nos données modifiées:
db.newfoo.find()
{ "_id" : ObjectId("544548a71b5cf91c4893eb9a"), "someotherdata" : [ 1, 2, 3 ], "coords" : { "lat" : 1, "lon" : 2 } }
{ "_id" : ObjectId("544548a81b5cf91c4893eb9b"), "someotherdata" : [ 4, 5, 6 ], "coords" : { "lat" : 4, "lon" : 1 } }
Une fois que vous êtes heureux avec les nouvelles données, vous pouvez alors utiliser l' renameCollection()
commande à abandonner les anciennes données et utiliser les nouvelles données en vertu de l'ancien nom de:
> db.newfoo.renameCollection("foo", true)
{ "ok" : 1 }
> db.foo.find()
{ "_id" : ObjectId("544548a71b5cf91c4893eb9a"), "someotherdata" : [ 1, 2, 3 ], "coords" : { "lat" : 1, "lon" : 2 } }
{ "_id" : ObjectId("544548a81b5cf91c4893eb9b"), "someotherdata" : [ 4, 5, 6 ], "coords" : { "lat" : 4, "lon" : 1 } }
Une dernière note, - jusqu'à ce que le SERVEUR 7944 est terminée, vous ne pouvez pas faire l'équivalent d'un instantané en faisant allusion à l' _id
de l'indice comme le suggère cette réponse et ainsi, vous pouvez finir par frapper un document de plus d'une fois si l'activité de ailleurs fait déplacer. Depuis que vous êtes à l'insertion de l' _id
champ dans cet exemple, une telle éventualité serait la cause d'une clé unique de la violation, de sorte que vous n'aurez donc pas à dupes, mais vous pourriez avoir une "vieille" version d'un document. Comme toujours, vérifiez vos données à fond avant de le laisser tomber, et, de préférence, prendre une copie de sauvegarde.