2011-01-27 60 views

回答

29

執行此類操作的最簡單方法是循環訪問字段名稱的數據集。最簡單的方法是編寫一個執行重寫的函數,然後在shell中使用.find().forEach()語法。

下面是從殼樣本:

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

在上述情況下,我做一個$unset,並在同一動作$set。 MongoDB不支持跨集合的事務,但上面是單個文檔。所以你保證set和unset是原子的(,即它們都成功或者它們都失敗了)。

這裏唯一的限制是您需要管理外部編寫者以保持數據的一致性。我一般喜歡這個只是在更新時關閉寫入。如果這個選項不可用,那麼你必須找出你想要的數據的一致性水平。 (我可以在這裏提供一些想法,但它確實會針對您的數據和系統)

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

這將重命名集合中每一行的列。另外,我發現如果你的列(你正在重命名的)出現在索引目錄(db.collection_name.getIndexes())中,那麼你將不得不刪除並重新創建索引(使用新的列名稱)。

+6

這個問題明確詢問如何在沒有$ rename的情況下完成此操作... – samkass 2012-03-20 20:50:34