2017-12-05 31 views
0

非常に大きな文書(各文書に約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

システムが自分自身を守っています。

一般に、大きな文書を使用してもCouchDBのsweetspotには当てられません。深く入れ子構造や非常に複雑な地図を追加すると、状況はさらに悪化します。

データモデルの再検討をお勧めします。 (多くの)小さな文書を使用します(1つのマテリアルにつき1つ、たとえば)。あなたの地図機能ははるかに簡単になります。

+0

ありがとうございました!私はデータ・モデルを変更して1つの文書を1つの文書で使用するようにしました。最初の索引はしばらくかかりましたが、索引の更新ははるかに高速です。 –

関連する問題