$rename函数仅在开发版本1.7.2中可用.

推荐答案

执行此类操作的最简单方法是在数据集中循环,重新映射字段的名称.最简单的方法是编写一个执行重写的函数,然后在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是原子的(i.e. they both succeed or they both fail).

这里唯一的限制是,您需要管理外部写入程序以保持数据的一致性.我通常倾向于在更新时关闭写操作.如果此选项不可用,则必须确定数据的一致性级别.(我可以在这里提供一些 idea ,但它将真正针对您的数据和系统)

Mongodb相关问答推荐

geoLocation或geoNear为坐标和半径使用let变量

如何将数组$拉到对象数组下

MongoDB/Mongoose查询:使用优先约束检索从位置A到位置B的路径

MongoDB - 来自先前匹配文档的聚合匹配字段

为什么使用 Golang Mongo 驱动程序进行简单查询需要超过 2 秒?

按数组mongodb中的第一个元素排序

在 ExpirePolicy 之后从 Store 中删除元素

mongoDB文档数组字段中的唯一项如何

Golang:如何判断 collection.Find 是否没有找到任何文件?

使用 homebrew 和 Xcode 8.1.1 安装 Mongodb 失败

MongoDB 2.1 聚合框架总和匹配名称的数组元素

如何在 MongoDB 中进行内部连接?

在 Mongo 中存储嵌套类别的最有效方法?

在 Nodejs 中配置最大旧空间大小

ZonedDateTime 与 MongoDB

使用 mongodb 在数组中查找子文档

无法连接到远程服务器上的 mongo

更新时提示Field name duplication not allowed with modifiers

将新值推送到 mongodb 内部数组 - mongodb/php

验证 MongoCredential 的异常和未分类的 Mongo Db 异常