MongoDB 1.6.5:如何重命名集合中的字段

Art*_*rty 17 mongodb

$ rename函数仅在开发版本1.7.2中可用.如何在1.6.5中重命名字段?

Gat*_* VP 29

执行此类操作的最简单方法是循环重新映射字段名称的数据集.最简单的方法是编写一个执行重写的函数,然后使用.find().forEach()shell中的语法.

这是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();
Run Code Online (Sandbox Code Playgroud)

在上述情况下我做的$unset$set在同样的动作.MongoDB不支持跨集合的事务,但上面是单个文档.因此,您可以保证set和unset将是原子的(即它们都成功或者它们都失败).

这里唯一的限制是你需要管理外部编写器以保持数据的一致性.我对此的正常偏好只是在此更新时关闭写入.如果此选项不可用,那么您必须确定数据的一致性级别.(我可以在这里提供一些想法,但它确实会特定于您的数据和系统)


Mic*_*lop 16

db.collection_name.update({}, {$rename: {"oldname": "newname"}}, false, true);
Run Code Online (Sandbox Code Playgroud)

这将重命名集合中每行的列.

此外,我发现如果您的列(您要重命名的列)出现在索引目录(db.collection_name.getIndexes())中,那么您将不得不删除并重新创建索引(使用新列名称) )也.

  • 这里有一个语法错误 - 最后一个`}`是错误的.你想运行`db.collection_name.update({},{$ rename:{"oldname":"newname"}},false,true);`. (14认同)
  • 问题明确询问如何在没有$ rename的情况下完成此任务... (6认同)