Portál AbcLinuxu, 30. dubna 2025 11:53
SELECT autor.jmeno FROM autor NATURAL JOIN kniha
GROUP BY autor.id
HAVING COUNT(kniha.jazyk) > 2
SELECT * FROM autor NATURAL JOIN kniha WHERE 1800 < autor.rok_narozeni < 1900
{"type": "book", "name": "Ílion (dvojjazyčné vydání)", "author": "Dan Simmons", "langs": ["čeština", "angličtina"]}
), tak je to jednoduché:
// map function(doc) { if (doc.type == "book") { emit(length(doc.langs), doc.author); } }Pro knihy ve dvou a více jazycích se pak zeptáte nějak takhle:
http://localhost:5984/pokus/_design/books/_view/author_by_langs_count?startkey=2
. To samozřejmě dostanete každého autora tolikrát, kolik takových knih má. Dalo by se to doplnit nějakou redukcí, ale na tu si z hlavy netroufám http://localhost:5984/pokus/_all_docs
dostanete autory (vizte http://wiki.apache.org/couchdb/HTTP_Bulk_Document_API).
To slovo join jsem asi neměl používat ani v uvozovkách, skutečně to není joinování ani unionování a přemýšlet nad dokumentovou databází v pojmech ze světa SQL nemůže vést k ničemu dobrému. Pokud potřebujete takovéhle dotazy často (a z nějakého jiného důvodu opravdu chcete používat dokumentovou databázi), pak je obvyklé si potřebné hodnoty předpočítávat.
struct word { char* name; /*void* data;*/ } words []={ {"abracadabra"}, {"hotenpotem"}, {"brekeke"}, {"tamten"} }; char *substrings[]={ "bra", "bre", "ten", "tam" }; for(char** fac=substrings; fac<substrings+sizeof(substrings)/sizeof(*substrings);fac++) { int cnt=0; for(word* w=words; w<words+sizeof(words)/sizeof(*words);w++) if(strstr(w->name, *fac)) cnt++; printf("%s %d", *fac, cnt); }
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.