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

You should also read:

Fazendo log de queries no PostgreSQL

ALTER DATABASE your_database_nameSET log_statement = 'all';// https://stackoverflow.com/questions/722221/how-to-log-postgresql-queriesSELECT set_config('log_statement', 'all', true); postgresql.conf#log_directory = 'pg_log' to log_directory = 'pg_log'#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' to log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'#log_statement…

CouchDB + HAProxy

Instalando o CouchDB pelo Docker sudo docker run -d --restart unless-stopped --hostname couchdb1 --name couchdb1 -p 5984:5984 couchdb Instalando o HAProxy via APT…