2016-04-01 7 views
5

Ich arbeite derzeit an einem Projekt, wo wir heute Couchebase 4.1 für eine eCommerce-Website verwenden.Couchbase 4.5 zurück Teil des Dokuments

Ich möchte die gesamte Kategoriestruktur unserer Websites in Couchbase als einzelnes Dokument speichern und dann nach einer bestimmten Kategorie suchen und diese Kategorie in einigen Fällen zurückgeben. In anderen Fällen möchte ich die Kategorie und ihre untergeordneten Kategorien zurückgeben.

Ich bin mir ziemlich sicher, dass ich den Array Indexeer verwenden muss, um diese Arbeit effizient zu machen, aber ich bin ziemlich neu in Couchbase, so dass ich nicht sicher bin, wie es strukturiert sein sollte (oder sogar wenn es möglich ist).

Teil meiner Dokument sieht wie folgt aus (es gibt 4 Ebenen in der Struktur und ca. 8-10 Top-Level-Kategorien):

{ 
    "Categories": [ 
    { 
     "DisplayName": "Category One", 
     "Id": 1, 
     "Categories": [ 
     { 
      "DisplayName": "Child category", 
      "Id": 10, 
      "Categories": [ 
      { 
       "DisplayName": "Child child category", 
       "Id": 100, 
       "Categories": [ 
       { 
        "DisplayName": "Child child child category", 
        "Id": 1000 
       }, 
       { 
        "DisplayName": "Sibling child category", 
        "Id": 1001 
       }     
       ] 
      }, 
      { 
       "DisplayName": "Child", 
       "Id": 101, 
       "Categories": [ 
       { 
        "DisplayName": "Another child category", 
        "Id": 2001 
       } 
       ] 
      }    
      ] 
     } 
     ] 
    } 
    ] 
} 

Wenn ich für Id abfragen = 100 Ich möchte mein Ergebnis haben so aussehen:

{ 
    "DisplayName": "Child child category", 
    "Id": 100, 
    "Categories": [ 
    { 
     "DisplayName": "Child child child category", 
     "Id": 1000 
    }, 
    { 
     "DisplayName": "Sibling child category", 
     "Id": 1001 
    }     
    ] 
} 

In einigen Fällen bin ich nicht interessiert, die Kinder zu haben. Ich habe versucht, meine Abfrage mit dem Array (N1QL) zu erstellen, um in meine Arrays auszuwählen, aber ich bin mir nicht sicher, ob es sogar möglich ist, wenn Ebenen von komplexen Objekten haben.

Kann mir eine Anleitung geben, wie das möglich ist (auch wenn es ist?). Wir verwenden den Couchbase .NET Client.

Mit freundlichen Grüßen Martin

Antwort

0

Das einzige, was ich ist SubDoc (zuerst in Couchbase 4.5) finden Sie unter: http://blog.couchbase.com/2016/february/subdoc-explained

+1

subdoc * könnte * eine gute Passform, aber es ist nicht für die Abfrage Zwecke: Sie ** müssen den Weg (e) wissen, die Sie wollen abrufen **. Wenn die Dokumentstruktur jedoch so geändert werden kann, dass das Stammobjekt ein Wörterbuch ist, 1 Eintrag pro Kategorie, wobei der Attributname die Kategorie-ID ist, könnte dies funktionieren. –

2

Das ist interessant, weil man alles in einem Dokument zu speichern versuchen, und dann Abfrage in dieses Dokument. Hier ist ein Ansatz.

Zur Kategorie Id 100 ohne Untergruppen abfragen:

SELECT c.Id, c.DisplayName 
FROM default 
UNNEST (ARRAY cat FOR cat WITHIN Categories WHEN cat.Id IS NOT NULL END) AS c 
WHERE c.Id = 100; 

Zur Kategorie-ID 100 mit Subkategorien abfragen:

SELECT c.Id, c.DisplayName, c.Categories 
FROM default 
UNNEST (ARRAY cat FOR cat WITHIN Categories WHEN cat.Id IS NOT NULL END) AS c 
WHERE c.Id = 100; 

Zur Kategorie-ID 100 mit nur einer Ebene von Teil abfragen Kategorien:

SELECT c.Id, c.DisplayName, sub.Id AS SubId, sub.DisplayName AS SubDisplayName 
FROM default 
UNNEST (ARRAY cat FOR cat WITHIN Categories WHEN cat.Id IS NOT NULL END) AS c 
LEFT OUTER UNNEST c.Categories AS sub 
WHERE c.Id = 100; 
+0

Es sieht wirklich gut aus! Ich werde es als erstes am Montagmorgen ausprobieren! Wird es möglich sein, einen Index zu erstellen, um die Suche zu beschleunigen? Konnte in der Dokumentation nichts finden und eine Suche ergab keine echte Antwort. – Martin

+1

Ich habe versucht, einen Index dafür zu erstellen, aber es ist nicht mit 4.5 möglich. Das Problem besteht darin, dass sich alle Ihre Daten in einem einzigen Dokument befinden. In der Regel wird ein Index von Werten auf Dokumente abgebildet, sodass Sie schnell das richtige Dokument erreichen können. In Ihrem Fall benötigen Sie einen Index, um in einen Teil des Dokuments zu gelangen und Ihnen dabei zu helfen, das gesamte Dokument zu verarbeiten. Nicht wirklich möglich mit 4.5. – geraldss

+0

Eine weitere Option ist die Verwendung einer Kartenreduzierungsansicht. Die Map-Reduce-Ansicht würde jede Kombination von (Id, DisplayName, Categories) ausgeben und speichern, und Sie können die Ansicht für eine bestimmte ID direkt abfragen. Sie können die Couchbase-Dokumente in Map-Reduction-Ansichten anzeigen und eine emit() -Funktion in JavaScript schreiben. – geraldss

Verwandte Themen