2011-01-27 59 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