我试图在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会说"操作系统进程超时"在创建视图时。
我的问题:是否有更快速和/或更优雅的方式来遍历所有这些步骤,最终到达深埋的数量"我需要的价值?
非常感谢提前!
答案 0 :(得分:1)
系统正在保护自己。
一般来说,使用大型文档并不会影响CouchDB的甜点。添加深层嵌套结构和非常复杂的地图,你的情况更糟。
我建议您重新考虑您的数据模型。使用(多)较小的文件(每种材料一个,比方说)。你的地图功能也会更加简单。