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!
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. –