我最近在名为 content 的类型化JSONObject字段中将POJO从所有类型属性更改为空闲内容。
问题是所有旧文档都映射到旧的POJO版本,所以它们存储如下:
{"_id":"ObjectId(value)","field1":"value1","field2":"value2"}
我是否可以通过单个mongo命令更新所有字段,以便我可以包装除id之外的所有内容,因此结果将是这样的:
{"_id":"ObjectId(value)","content":{"field1":"value1","field2":"value2"}}
或者我应该编写一个逐个执行的简单程序? (如在迭代所有值时,手动添加新的内容级别)
答案 0 :(得分:1)
不幸的是,没有MongoDB命令允许您以这种方式重构文档。您需要编写一个程序来逐个获取所有文档,更新结构,然后将更新的结构发送回MongoDB。
通常,最好的方法是将修改后的文档写入新集合,然后在完成后删除旧集合。
答案 1 :(得分:1)
我解决了它创建一个.js文件,通过mongo shell执行。
mongo myDb fixresults.js
该文件如下:
for( var c = db.results.find(); c.hasNext(); ) {
var full = c.next();
var anon = db.results.findOne({"_id":full._id},{"_id":0});
var n = {"_id":full._id,"content":anon};
db.results.temp.insert(n);
}
这会将转换后的值插入到.temp集合中,稍后可以重命名以替换原始集合。