$ rename功能仅在开发版本1.7.2中可用。 如何在1.6.5中重命名字段?
答案 0 :(得分:29)
执行此类操作的最简单方法是循环重新映射字段名称的数据集。最简单的方法是编写一个执行重写的函数,然后在shell中使用.find().forEach()
语法。
以下是来自shell的示例:
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将是原子的(,即它们都成功或者它们都失败)。
这里唯一的限制是你需要管理外部编写者以保持数据的一致性。我对此的正常偏好只是在此更新时关闭写入。如果此选项不可用,那么您必须确定数据的一致性级别。 (我可以在这里提供一些想法,但它确实会特定于您的数据和系统)
答案 1 :(得分:16)
db.collection_name.update({}, {$rename: {"oldname": "newname"}}, false, true);
这将重命名集合中每一行的列。
另外,我发现如果您的列(您要重命名的列)出现在索引目录(db.collection_name.getIndexes())中,那么您将不得不删除并重新创建索引(使用新列名称)。