非常に大きな文書(各文書に約300k-900k行、合計で約15-20文書)については、CouchDB 2.1でビューを作成しようとしています。文字列をキーとした大きな文書のCouchdbビュー
文書は、次のようになります。
{
"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になります)。
私が1つのドキュメントを使用しているときに、インデックスを作成しても、2番目のドキュメント(15または20は勿論)でも、ビューの作成中に "OS process timed out"と表示されます。
私の質問:これらのすべての手順を繰り返して、最終的に深く埋もれた「金額」の価値を得るためには、より高速でエレガントな方法がありますか?
事前に感謝します。
ありがとうございました!私はデータ・モデルを変更して1つの文書を1つの文書で使用するようにしました。最初の索引はしばらくかかりましたが、索引の更新ははるかに高速です。 –