在大型文档上使用字符串作为键超时的Couchdb视图

时间:2017-12-05 09:00:52

标签: javascript couchdb couchdb-futon

我试图在CouchDB 2.1中为非常大的文档创建一个视图(每个文档大约300k-900k行,总共大约15-20个文档)。

文件如下:

{
"222123456": {
    "_id": "222123456",
    "type": "Order",
    "0300": {
        "51234567": {
            "_id": "51234567",
            "type": "Material",
            "DS": "M532F1234567",
            "HTZ": "M532-F1234-000-00",
            "A name for some material": {
                "_id": "A name for some material",
                "type": "Description",
                "0054": {
                    "600": {
                        "1": {
                            "_id": "1",
                            "type": "Amount",
                            "X": {
                                "11220": {
                                    "_id": "11220",
                                    "type": "row"
                                },
                                "_id": "X",
                                "type": "Bulk"
                            }
                        },
                        "_id": "600",
                        "type": "Site"
                    },
                    "_id": "0054",
                    "type": "Pos"
                }
            }
        },
        "51255111": {
            // And another material
            // ...
        },
        "_id": "0300",
        "type": "Process"
    }
    // + more orders with more items
},
"222555666": {
    // Another order with more processes which contain even more materials
    // ...
},
"_id": "FileImport_001",
"_rev": "1-2f77e699332bb7c76a137b86f83bbe91",
"type": "Machine"
}

每个文档都有1-n个订单,每个订单都有1-n个流程,每个流程都包含1-n个我试图查询的资料。我当前的视图使用for循环遍历所有订单,流程和材料。

这是我使用的视图:

function (doc) {
    var splitMsn = doc._id.split("_"); // Split _id into [FileImport, 001] array
    for (var key_order in doc) { // For every order in the document...
        if (typeof doc[key_order] == 'object' && doc[key_order] != '') { // where the value is an object and not empty...
            var order = doc[key_order]; // Save the order as a value
            for (var key_process in order) { // ...and search all processes in that order nr
                if (typeof order[key_process] == 'object' && order[key_process] != '') { // If process contains an object as value and it's not empty
                    var process = order[key_process]; // Save the process as a value
                    for (var key_matnr in process) { // For every material in the process
                        if (typeof process[key_matnr] == 'object' && process[key_matnr] != '') { // If material nr contains an object as value and not empty
                            var matnr = process[key_matnr]; // Save material nr as value
                            for (var key_matname in matnr) { // For every material name in the material number
                                if (typeof matnr[key_matname] == 'object' && matnr[key_matname] != '') { // Contains object and not empty
                                    var matname = matnr[key_matname]; // Save material name
                                    emit([splitMsn[1], key_order, key_process, key_matnr], matname); // emit [001, 222123456, 0300, 51234567], Material name
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

通过此视图,我可以查询特定的凭证编号,订单,流程和物料编号。作为回报,我得到了材料名称和金额(例如我之后的1)。

当我使用一个文档时,索引创建得很好,但即使是第二个文档(更不用说15或20),CouchDB会说"操作系统进程超时"在创建视图时。

我的问题:是否有更快速和/或更优雅的方式来遍历所有这些步骤,最终到达深埋的数量"我需要的价值?

非常感谢提前!

1 个答案:

答案 0 :(得分:1)

系统正在保护自己。

一般来说,使用大型文档并不会影响CouchDB的甜点。添加深层嵌套结构和非常复杂的地图,你的情况更糟。

我建议您重新考虑您的数据模型。使用(多)较小的文件(每种材料一个,比方说)。你的地图功能也会更加简单。