2016-04-01 14 views
5

Obecnie pracuję nad projektem, w którym używamy biblioteki couchbase 4.1 od dzisiaj dla witryny eCommerce.Couchbase 4.5 zwraca część dokumentu

Chciałbym przechowywać naszą stronę internetową całą strukturę kategorii w Couchbase jako pojedynczy dokument, a następnie zapytać o konkretną kategorię i zwrócić tę kategorię w niektórych przypadkach, aw innych przypadkach chciałbym zwrócić kategorię i jej kategorie podrzędne.

Jestem prawie pewny, że muszę użyć indeksera tablicowego, aby ten działał wydajnie, ale jestem całkiem nowy w Couchbase, więc nie jestem pewien, jak powinien on być zbudowany (a nawet, jeśli to możliwe).

Część mojego dokumentu wygląda następująco (istnieje 4 poziomy w strukturze i około 8-10 kategorii najwyższego poziomu):

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

Gdybym zapytania o id = 100 Chciałbym mieć mój wynik wygląda tak:

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

W niektórych przypadkach nie interesuje mnie posiadanie dziecka. Próbowałem utworzyć moje zapytanie przy użyciu tablicy (N1QL), aby wybrać do moich tablic, ale nie jestem pewien, czy jest to nawet możliwe, gdy poziomy obiektów złożonych.

Czy mogę dać mi wskazówki, jak to możliwe (nawet jeśli jest?). Używamy klienta Couchbase .NET.

poważaniem Martin

Odpowiedz

0

Jedyne co mogę znaleźć jest subdoc (pierwszy dostępny w Couchbase 4.5): http://blog.couchbase.com/2016/february/subdoc-explained

+1

subdoc * może * świetnie pasować, ale nie służy do celów zapytań: musisz znać ścieżki, których potrzebujesz pobrać **. Jeśli jednak struktura dokumentu może zostać zmieniona tak, aby obiekt główny był słownikiem, 1 pozycja na kategorię, przy czym nazwa atrybutu jest identyfikatorem kategorii, może to działać. –

2

Jest to interesujące, ponieważ staramy się przechowywać wszystko wewnątrz jednego dokumentu, a następnie zapytanie do tego dokumentu. Oto jedno podejście.

Aby wyszukać ID kategorii 100 bez podkategorii:

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; 

Aby wyszukać ID kategorii 100 z podkategorii:

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; 

Aby wyszukać ID kategorii 100 tylko jednego poziomu pod- kategorie:

+0

Wygląda naprawdę dobrze! Wypróbuję to jako pierwszy poniedziałek rano! Czy możliwe będzie również utworzenie indeksu, aby wyszukiwanie było szybsze? Nie można znaleźć niczego w dokumentacji, a wyszukiwanie nie dało żadnej realnej odpowiedzi. – Martin

+1

Próbowałem utworzyć indeks dla tego, ale nie jest to możliwe z 4.5. Problem polega na tym, że wszystkie twoje dane znajdują się w jednym dokumencie. Zazwyczaj indeks mapuje wartości do dokumentów, dzięki czemu można szybko dotrzeć do właściwego dokumentu. W twoim przypadku potrzebujesz indeksu, aby dotrzeć do części dokumentu i pomóc ci uniknąć przetwarzania całego dokumentu. Naprawdę niemożliwe z 4.5. – geraldss

+0

Inną opcją jest użycie widoku zmniejszania mapy. Widok zmniejszający mapę będzie emitował i zapisywał każdą kombinację (Id, DisplayName, Categories), a następnie można wyświetlić widok bezpośrednio dla danego identyfikatora. Dokumenty Couchbase można zobaczyć na mapie - zmniejsz liczbę widoków i zapisuj funkcję emit (w języku JavaScript). – geraldss