Fazendo FOREIGN KEYS, fazendo JOINs e árvores no CouchDB
O jeito mais completo de se fazer o equivalente a JOINs no CouchDB é usando uma técnica chamada "view collation". Basicamente consiste em você criar uma view que faça o "emit" da chave da referência na chave.
- O exemplo abaixo precisa ser melhorado.
Crie os seguintes 3 documentos:
{"_id": "a", "name": "aaa" } { "_id": "b", "name": "bbb" } { "_id": "c", "name": "ccc", "parents": [ {"_id": "a"}, {"_id": "b"} ] }
Crie uma view/índice com o seguinte:
function (doc) {if(doc.parents){ for(var i = 0; i emit(doc._id, doc.parents[i]); } } }
E agora, quando você for visualizar a view, use include_docs=true:
http://localhost:5984/test/_design/test/_view/new-view?include_docs=true
O segredo está em enviar um objeto com "_id": "id_do_objeto" no campo VALUE da chamada de função emit.
Extra: um comportamento curioso das VIEWs
Outra coisa interessante nas VIEWs é que você pode fazer o emit de um objeto JSON com {... _id: "id_de_um_documento" ...} no campo value e ao chamar a view com include_docs=true será retornado o documento "id_de_um_documento" completo ao invés do documento original.
Referências
Views Collation - Documentação oficial do CouchDB
https://docs.couchdb.org/en/stable/ddocs/views/collation.html
Views Collation - Jo CouchDB best practices
https://jo.github.io/couchdb-best-practices/#view-collation