$rename 功能仅在开发版本 1.7.2 中可用。 1.6.5如何重命名字段?
最佳答案
执行此类操作的最简单方法是循环遍历数据集重新映射字段名称。最简单的方法是编写一个执行重写的函数,然后在 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 将是原子的(即它们都成功或都失败)。
这里唯一的限制是您需要管理外部编写者以保持数据一致。我对此的正常偏好只是在更新时关闭写入。如果此选项不可用,那么您必须弄清楚您希望数据的一致性级别。 (我可以在这里提供一些想法,但它确实会针对您的数据和系统)
关于MongoDB 1.6.5 : how to rename field in collection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4813160/