Как ссылаться на другие документы в представлении couchDB (объединяя как функциональность) - PullRequest
8 голосов
/ 07 января 2011

У нас есть CouchDB-представление базы данных XML, которое мы используем для обеспечения работы внешнего интерфейса на основе JavaScript для манипулирования документами XML. Базовая структура представляет собой простую трехуровневую иерархию. т.е.

A -> B -> C

A: родительский документ (тип A) B: любое количество дочерних документов родительского типа A C: любое количество дочерних документов родительского типа B

Мы представляем эти 3 типа документов в CouchDB с атрибутом type:

например.

{
"_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",
}

То, что я хочу сделать, - это создать представление, которое возвращает документы точно так же, как тип A, но включает атрибут метки из документа B в списке logicMap, например

{
"_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...
        }
    }
}
}

Я изо всех сил пытаюсь обдумать лучший способ выполнить это. Похоже, все должно быть довольно просто!

1 Ответ

7 голосов
/ 07 января 2011

Взгляните на раздел «Связанный документ» в 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']});
        }
    }
}

(не проверено)

Затем запросите include_docs=true

...