MongoDB的。按字段比较两个集合。脚本在嵌套数组上崩溃

时间:2016-01-19 12:19:37

标签: javascript mongodb

我需要将两个集合与大量嵌套对象和数组进行比较。这是文档的结构 structure of a single document

这是我的代码

function iterate_array (my_array, path, cur_id) {
    for(item in my_array) {
            if (item == "cloudTimestamp") {
                    continue;
            } else if (typeof my_array[item] == "object") {
                    var x = path.slice();
                    x.push(item);
                    iterate_array(my_array[item], x, cur_id);
            } else if (typeof my_array[item] == "function") {
                    continue;
            } else {
                    other_val = otherdb.product.findOne({"_id" : cur_id});
                    if (path == '') {
                            if (my_array[item] == other_val[item]) {
                                    print("field matched");
                            } else {
                                    print("field NOT matched");
                            }
                    } else {
                            var string_path = JSON.stringify(path).replace(/[^A-Za-z0-9,]/g, '').replace(/,/g, '.');
                            if (my_array[item] == other_val[string_path][item]) {
                                    print("field matched");
                            } else {
                                    print("field NOT matched");
                            }
                    }
            }
    }
}

var db = db.getSiblingDB('smcdb_bos_new');
var otherdb = db.getSiblingDB('smcdb_boa_new');
var cursor = db.product.find();
cursor.forEach( function (mydoc) {
    iterate_array(mydoc, [], mydoc['_id']);
});

脚本一直有效,直到达到XrefHistory.values数组。然后它崩溃并出现以下错误:

2016-01-19T07:15:38.566-0500 TypeError: Cannot read property '0' of undefined at compare.js:22

1 个答案:

答案 0 :(得分:0)

您的代码中存在错误:

var string_path = JSON.stringify(path).replace(/[^A-Za-z0-9,]/g, '').replace(/,/g, '.');
if (my_array[item] == other_val[string_path][item]){
...
} else
{
}

您正尝试使用string_path other_val来访问数据,但这不会起作用。您要做的是other_val['a.b.c'],其实际上应该是other_val['a']['b']['c']other_val.a.b.c.。因此找不到密钥,因此从undefined中读取0。