2017-12-05 5 views
0

Ich versuche, in CouchDB 2.1 eine Ansicht für Dokumente, die sehr groß sind (ca. 300k-900k Zeilen für jedes Dokument, ca. 15-20 Dokumente insgesamt) erstellen.Couchdb-Ansicht auf große Dokumente mit Zeichenfolgen als Schlüssel

Die Dokumente wie folgt aussehen:

{ 
"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" 
} 

Jedes Dokument hat 1-n Aufträge, jeder Auftrag hat 1-n Prozesse und jeder Prozess enthält 1-n Materialien, die ich abfragen bin versucht. Meine aktuelle Ansicht durchläuft alle Aufträge, Prozesse und Materialien mit for-Schleifen.

Dies ist die Ansicht Ich verwende:

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 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Mit dieser Ansicht, die ich für eine bestimmte Dokumentnummer, um, zu verarbeiten und die Materialnummer abfragen. Im Gegenzug bekomme ich den Materialnamen mit der Menge (z. B. 1, nach der ich gesucht habe).

Wenn ich ein Dokument verwende, wird der Index gut erstellt, aber selbst mit einem zweiten Dokument (geschweige denn 15 oder 20) sagt CouchDB, dass "OS-Prozess abgelaufen" beim Erstellen der Ansicht.

Meine Frage: Gibt es eine schnellere und/oder elegantere Art, alle diese Schritte zu durchlaufen, um endlich zu dem tief vergrabenen "Betrag" -Wert zu kommen, den ich brauche?

Vielen Dank im Voraus!

Antwort

1

Das System schützt sich vor Ihnen.

Im Allgemeinen trifft die Verwendung von großen Dokumenten nicht auf CouchDBs Sweetspot. Fügen Sie tief verschachtelte Strukturen und sehr komplexe Karten hinzu und Ihre Situation ist noch schlimmer.

Ich würde empfehlen, Ihr Datenmodell zu überdenken. Verwenden Sie (viel) kleinere Dokumente (eines pro Material, sagen wir). Ihre Kartenfunktion wird auch viel einfacher.

+0

Vielen Dank für die Antwort! Ich änderte das Datenmodell, um ein Dokument pro Auftrag zu verwenden, der erste Index dauerte eine Weile, aber die Aktualisierung des Indexes ist jetzt viel schneller. –

Verwandte Themen