我需要重新构建数据库中的文档。具体来说,我有一个包含一组子文档的数组,但我需要使用子文档将这个数组转换为一个对象' id字符串作为字段名称(我意识到这是一个非理想的结构,但这个决定有一个原因部分归因于遗留数据和效率问题)。
我的文档看起来大致如下:
{
_id: ObjectId(" . . . "),
my_target_field: [
{
_id: ObjectId("a"),
some_array: [ {...}, {...} ]
},
{
_id: ObjectId("b"),
some_array: [ {...}, {...}, {...} ]
}
]
}
我需要的是大致相同的东西:
{
_id: ObjectId(" . . . "),
my_target_field: {
a: {
_id: ObjectId("a"),
some_array: [ {...}, {...} ]
},
b: {
_id: ObjectId("b"),
some_array: [ {...}, {...}, {...} ]
}
}
}
我的forEach
电话目前看起来像这样:
db.my_collection.find({
some_invalid_field: {$exists: false}
}).forEach(function(doc) {
var original_arr = doc.my_target_field ? doc.my_target_field : [];
var converted_obj = {};
for(var i = 0; i < original_arr.length; i++) {
var cur_sub_doc = original_arr[i];
converted_obj[cur_sub_doc._id.valueOf()] = cur_sub_doc;
}
db.my_collection.update({
_id: doc._id
}, {$set: {
my_target_field: converted_obj
}});
这种类有效,但我发现很多应该正确转换的文档最终会丢失数据并最终看起来像:
{
_id: ObjectId(" . . . "),
my_target_field: { }
}
对于具有空数组的文档,这是期望的,但是即使具有非空数组的文档有时也会看起来像这样。尽管其他文档正确更新并具有预期结构,但仍会发生这种情此外,数组中的子文档并不缺少ObjectIds,如果我恢复备份并尝试仅使用以前失败的文档的脚本,那么这些文档似乎没有任何问题,所以这种行为甚至不一致。
对于可能导致此问题的任何见解将不胜感激。我对这可能是什么原因感到很茫然。