$重命名功能仅在开发版本1.7.2中可用。 如何在1.6.5中重命名字段?MongoDB 1.6.5:如何重命名集合中的字段
17
A
回答
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())中,那么你将不得不删除并重新创建索引(使用新的列名称)。
这个问题明确询问如何在没有$ rename的情况下完成此操作... – samkass 2012-03-20 20:50:34