2011-01-07 6 views
8

Abbiamo una rappresentazione CouchDB di un database XML che usiamo per alimentare un front-end basato su javascript per manipolare i documenti XML. La struttura di base è una semplice gerarchia a 3 livelli. cioèCome fare riferimento ad altri documenti in una vista divanoDB (unendo funzionalità simile)

A -> B -> C

A: documento principale (tipo A) B: qualsiasi numero di documenti figlio di genitore di tipo A C: qualsiasi numero di documenti figli di tipo genitore B

Rappresentiamo questi 3 tipi di documenti in CouchDB con un attributo type:

es.

{ 
"_id":"llgc-id:433", 
"_rev":"1-3760f3e01d7752a7508b047e0d094301", 
"type":"A", 
"label":"Top Level A document", 
"logicalMap":{ 
    "issues":{ 
     "1":{ 
      "URL":"http://hdl.handle.net/10107/434-0", 
      "FILE":"llgc-id:434" 
     }, 
     "2":{ 
      "URL":"http://hdl.handle.net/10107/467-0", 
      "FILE":"llgc-id:467" 
     etc... 
     } 
    } 
} 
} 


{ 
"_id":"llgc-id:433", 
"_rev":"1-3760f3e01d7752a7508b047e0d094301", 
"type":"B", 
"label":"a B document", 
} 

Quello che voglio fare è produrre una visione che restituisce i documenti proprio come il tipo A, ma include l'attributo etichette dal documento B all'interno della lista logicalMap esempio

{ 
"_id":"llgc-id:433", 
"_rev":"1-3760f3e01d7752a7508b047e0d094301", 
"type":"A", 
"label":"Top Level A document", 
"logicalMap":{ 
    "issues":{ 
     "1":{ 
      "URL":"http://hdl.handle.net/10107/434-0", 
      "FILE":"llgc-id:434", 
      "LABEL":"a B document" 
     }, 
     "2":{ 
      "URL":"http://hdl.handle.net/10107/467-0", 
      "FILE":"llgc-id:467", 
      "LABEL":"another B document" 
     etc... 
     } 
    } 
} 
} 

Sto lottando per ottenere la mia testa intorno al modo migliore per eseguire questo. Sembra che dovrebbe essere abbastanza semplice però!

risposta

7

Dai un'occhiata alla sezione "Documento Linked' in http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views#Linked_documents

function(doc) { 
    //.... 
    if (doc.logicalMap.issues) { 
     for (var i in doc.logicalMap.issues) { 
      emit([doc._id,doc.logicalMap.issues[i]['FILE']], 
           {_id: doc.logicalMap.issues[i]['FILE']}); 
     } 
    } 
} 

(non testato)

Poi query con include_docs=true

+1

Questo emette ogni numero in un risultato separata anche se non lo fa ? Speravo di creare un singolo documento per emettere – Surfrdan

+1

Si potrebbe anche 'emettere (doc._id, {_ id: doc.logicalMap.issues [i] ['FILE']});' e quindi unire i risultati in un ' riduci la funzione, tuttavia, dovresti mantenere i risultati ridotti come piccoli il più possibile in numeri, quindi preferirei spostare quel codice sul lato client. –

+2

Invece di unire i risultati in una funzione di riduzione, è possibile provare a creare una funzione di elenco. –