在forEach循环中更新MongoDB集合的文档结构时,行为似乎不一致且不正确

时间:2018-01-17 21:21:53

标签: mongodb

我需要重新构建数据库中的文档。具体来说,我有一个包含一组子文档的数组,但我需要使用子文档将这个数组转换为一个对象' 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,如果我恢复备份并尝试仅使用以前失败的文档的脚本,那么这些文档似乎没有任何问题,所以这种行为甚至不一致。

对于可能导致此问题的任何见解将不胜感激。我对这可能是什么原因感到很茫然。

0 个答案:

没有答案