Solange Sie mit der Erstellung einer Kopie der Daten einverstanden sind, kann das Aggregations-Framework hier als Alternative verwendet werden. Sie haben auch die Möglichkeit, mehr mit den Daten zu machen, wenn Sie andere Operatoren verwenden möchten, aber der einzige, den Sie brauchen, ist $project
. Das ist zwar etwas platzraubend, kann aber schneller sein und ist für manche Zwecke besser geeignet. Zur Veranschaulichung füge ich zunächst einige Beispieldaten in die Datei foo
Sammlung:
db.foo.insert({ 'lat': 1, 'lon': 2, someotherdata : [1, 2, 3] })
db.foo.insert({ 'lat': 4, 'lon': 1, someotherdata : [4, 5, 6] })
Jetzt verwenden wir einfach $project
zur Überarbeitung der lat
y lon
Felder, und senden Sie sie dann an die newfoo
Sammlung:
db.foo.aggregate([
{$project : {_id : "$_id", "coords.lat" : "$lat", "coords.lon" : "$lon", "someotherdata" : "$someotherdata" }},
{ $out : "newfoo" }
])
Dann prüfen Sie newfoo
für unsere veränderten Daten:
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 } }
Wenn Sie mit den neuen Daten zufrieden sind, können Sie die Funktion renameCollection()
um die alten Daten zu löschen und die neuen Daten unter dem alten Namen zu verwenden:
> 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 } }
Ein letzter Hinweis - bis SERVER-7944 abgeschlossen ist, können Sie nicht das Äquivalent eines Schnappschusses machen, indem Sie den Hinweis auf die _id
Index wie vorgeschlagen in diese Antwort und so kann es passieren, dass Sie ein Dokument mehr als einmal treffen, wenn es durch eine andere Aktivität verschoben wird. Da Sie die _id
Feld in diesem Beispiel würde jedes derartige Vorkommen zu einer Verletzung des eindeutigen Schlüssels führen, so dass Sie zwar keine Duplikate erhalten, aber möglicherweise eine "alte" Version eines Dokuments. Wie immer sollten Sie Ihre Daten gründlich überprüfen, bevor Sie sie löschen, und vorzugsweise eine Sicherungskopie erstellen.