2010-04-06 5 views
10

Come eseguirò una query equivalente a "selezionare la top 10" nel divano db?Seleziona l'ultimo/l'ultimo 10 in couchdb?

Per esempio ho un "schema" in questo modo:

title body modified 

e voglio selezionare gli ultimi 10 documenti modificati.

Come bonus aggiuntivo se qualcuno può inventare un modo per fare lo stesso solo per categoria. Quindi per:

title category body modified 

restituisce un elenco degli ultimi 10 documenti in ciascuna categoria.

Mi chiedo solo se tale query è possibile in couchdb.

+0

C'è un motivo per cui non vuoi farlo manualmente? Prima query per le categorie disponibili, quindi interrogare gli elenchi per categoria. Effettuando la seconda query in batch, è quasi come su query. –

+0

Posso farlo sì - ma la mia domanda è se qualcosa del genere sia Possibile in couchdb, in una query. Ad esempio, si può farlo in sql con un'istruzione select nidificata complessa e complessa. – drozzy

risposta

3

qui è ciò che devi fare.

funzione Map

function(doc) 
{ 
    if (doc.category) 
    { 
    emit(['category', doc.category], doc.modified); 
    } 
} 

allora avete bisogno di una funzione lista che li raggruppa, si potrebbe essere temped di abusare di un ridurre e fare questo, ma probabilmente gettare errori a causa di non ridurre abbastanza veloce con grandi insiemi di dati.

function(head, req) 
{ 
    % this sort function assumes that modifed is a number 
    % and it sorts in descending order 
    function sortCategory(a,b) { b.value - a.value; } 
    var categories = {}; 
    var category; 
    var id; 
    var row; 
    while (row = getRow()) 
    { 
    if (!categories[row.key[0]]) 
    { 
     categories[row.key[0]] = []; 
    } 
    categories[row.key[0]].push(row); 
    } 
    for (var cat in categories) 
    { 
    categories[cat].sort(sortCategory); 
    categories[cat] = categories[cat].slice(0,10); 
    } 
    send(toJSON(categories)); 
} 

è possibile ottenere tutte le categorie Top 10 ora con

http://localhost:5984/database/_design/doc/_list/top_ten/by_categories 

e ottenere la documentazione con

http://localhost:5984/database/_design/doc/_list/top_ten/by_categories?include_docs=true 

ora è possibile interrogare questo con un POST gamma multipla e limite di quali categorie

curl -X POST http://localhost:5984/database/_design/doc/_list/top_ten/by_categories -d '{"keys":[["category1"],["category2",["category3"]]}' 

non è inoltre possibile codificare il codice 10 e passare il numero tramite la variabile req.

Ecco un'altra vista/elenco trickery.

+0

Fantastico, lo proverò e tornerò da te! – drozzy

+0

Non ho provato questa risposta, ma lo accetterò comunque poiché non lavoro più con couchdb. – drozzy

7

Per ottenere i primi 10 documenti dal db è possibile utilizzare l'opzione di limitazione. E.g. chiamando

http://localhost:5984/yourdb/_design/design_doc/_view/view_name?limit=10 

Ottieni i primi 10 documenti.

Le righe di vista sono ordinate in base alla chiave; aggiungendo descending = true nella querystring si invertirà il loro ordine. Puoi anche emettere solo i documenti che ti interessano usando di nuovo la querystring per selezionare le chiavi che ti interessano. Quindi, a suo avviso si scrive la funzione mappa come:

function(doc) { 
    emit([doc.category, doc.modified], doc); 
} 

E la tua ricerca in questo modo:

http://localhost:5984/yourdb/_design/design_doc/_view/view_name?startkey=["youcategory"]&endkey=["youcategory", date_in_the_future]&limit=10&descending=true 
+0

Questa seconda query selezionerà effettivamente gli ultimi 10 elementi in Ciascuna delle categorie? O solo gli ultimi 10 articoli di una categoria? – drozzy

+0

Oops. Ho letto male la tua domanda. Seleziona gli ultimi 10 articoli da una categoria. – filippo

0

leggera correzione. non è stato ordinato fino a quando ho aggiunto la parola chiave "return" nella funzione sortCategory.Dovrebbe essere in questo modo:

function sortCategory(a,b) { return b.value - a.value; }