2011-01-27 18 views

答えて

29

このような操作を実行する最も簡単な方法は、フィールド名を再マッピングするデータセットをループすることです。これを行う最も簡単な方法は、書き換えを実行してシェルで.find().forEach()構文を使用する関数を書くことです。私は同じアクションで$unset$setをやっているような場合には

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(); 

:ここ

は、シェルからのサンプルです。 MongoDBはコレクション間のトランザクションをサポートしていませんが、上記は単一のドキュメントです。したがって、セットとアンセットがアトミックになることが保証されています(、つまり両方とも成功するか、どちらも失敗する)。

ここでの唯一の制限は、データを一貫性を保つために外部のライターを管理する必要があることです。私の普通の好みは、これが更新されている間だけ書き込みを止めることです。このオプションが利用できない場合は、データの整合性のレベルを把握する必要があります。これは、コレクション内の行ごとに列の名前を変更します

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

(私はここにいくつかのアイデアを提供することができますが、本当にあなたのデータとシステムに固有のものになるだろう)。

また、名前を変更している列がインデックスカタログ(db.collection_name.getIndexes())内に表示される場合、インデックスを削除して再作成する必要があることがわかりました。新しい列名)。

+6

$ renameなしでこれを達成する方法を明示的に質問しています... – samkass

+14

ここに構文エラーがあります - 最後の '}'が間違っています。 'db.collection_name.update({}、{$ rename:{" oldname ":" newname "}}、false、true);'を実行したいとします。 – girasquid

+0

-1これはMongoでは動作しません1.6.5 – opyate