2016-04-01 9 views
5

Attualmente sto lavorando a un progetto in cui stiamo utilizzando couchbase 4.1 ad oggi per un sito eCommerce.Couchbase 4.5 restituisce parte del documento

Desidero memorizzare i nostri siti Web in tutta la struttura di categorie in Couchbase come un singolo documento e quindi eseguire una query per una categoria specifica e restituire tale categoria in alcuni casi e in altri casi vorrei restituire la categoria e le sue categorie figlio.

Sono abbastanza sicuro di dover usare l'array indexeer per rendere questo lavoro efficiente ma sono abbastanza nuovo per Couchbase quindi non sono sicuro di come dovrebbe essere strutturato (o anche se è possibile).

Parte del mio documento simile a questo (v'è 4 livelli nella struttura e circa 8-10 categorie di primo livello):

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

Se interrogo per Id = 100 Vorrei avere il mio risultato assomiglia a questo:

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

In alcuni casi non mi interessa avere i bambini. Ho cercato di creare la mia query usando l'array (N1QL) per selezionare i miei array, ma non sono sicuro che sia possibile anche quando si hanno livelli di oggetti complessi.

Mi può dare una guida su come è possibile (anche se lo è?). Stiamo utilizzando il client Couchbase .NET.

migliori saluti Martin

risposta

0

L'unica cosa che posso trovare è SubDoc (prima disponibile in Couchbase 4.5): http://blog.couchbase.com/2016/february/subdoc-explained

+1

subdoc * potrebbe * essere un'ottima soluzione, ma non è per scopi di query: devi ** conoscere il percorso (s) che si desidera recuperare**. Tuttavia, se la struttura del documento può essere modificata in modo che l'oggetto radice sia un dizionario, 1 voce per categoria, essendo il nome attributo l'ID di categoria, allora questo potrebbe funzionare. –

2

Questo è interessante, perché si sta tentando di memorizzare tutto dentro un documento, quindi interrogazione in quel documento. Ecco un approccio.

per interrogare Categoria Id 100 senza sub-categorie:

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; 

per interrogare Categoria Id 100 con sub-categorie:

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; 

per interrogare Categoria Id 100 con un solo livello di sub categorie:

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

Sembra davvero buono! Lo proverò come prima cosa lunedì mattina! Sarà anche possibile creare un indice per rendere più veloce la ricerca? Non ho trovato nulla nella documentazione e una ricerca non ha dato alcuna risposta reale. – Martin

+1

Ho provato a creare un indice per questo, ma non è possibile con 4.5. Il problema è che tutti i tuoi dati sono in un unico documento. In genere, un indice mappa da valori a documenti, in modo da poter raggiungere rapidamente il documento giusto. Nel tuo caso, hai bisogno di un indice per raggiungere una parte del documento e aiutarti a evitare l'elaborazione dell'intero documento. Non proprio possibile con 4.5. – geraldss

+0

Un'altra opzione è usare una vista di riduzione della mappa. La vista di riduzione della mappa emetterebbe e memorizzerà ogni combinazione di (Id, DisplayName, Categorie) e potrai interrogare la vista direttamente per un dato Id. Puoi vedere i documenti di Couchbase sulla mappa: ridurre le visualizzazioni e scrivere una funzione emit() in JavaScript. – geraldss

Problemi correlati