Domanda

Sto usando la seguente funzione di visualizzazione per scorrere su tutti gli elementi nel database (al fine di trovare un tag), ma penso che le prestazioni siano molto scarse se il set di dati è grande. Qualche altro approccio?

def by_tag(tag):
return  '''
        function(doc) {
            if (doc.tags.length > 0) {
                for (var tag in doc.tags) {
                    if (doc.tags[tag] == "%s") {
                        emit(doc.published, doc)
                    }
                }
            }
        };
        ''' % tag
È stato utile?

Soluzione

Disclaimer: non l'ho testato e non so se può funzionare meglio.

Crea una singola vista permanente:

function(doc) {
  for (var tag in doc.tags) {
    emit([tag, doc.published], doc)
  }
};

E interroga con _view / your_view / all? startkey = ['your_tag_here'] & amp; endkey = ['your_tag_here', {}]

La struttura JSON risultante sarà leggermente diversa ma otterrai comunque l'ordinamento della data di pubblicazione.

Altri suggerimenti

Puoi definire una singola vista permanente, come suggerisce Bahadir. quando si esegue questo tipo di indicizzazione, tuttavia, non genera il documento per ogni chiave. Invece, emetti ([tag, doc.published], null). Nelle versioni di rilascio attuali dovresti quindi effettuare una ricerca separata per ciascun documento, ma il trunk SVN ora supporta le specifiche " include_docs = True " nella stringa di query e CouchDB unirà automaticamente i documenti nella tua vista per te, senza l'overhead dello spazio.

Sei sulla strada giusta con la vista. Un elenco di pensieri:

La generazione della vista è incrementale. Se il traffico letto è maggiore del traffico in scrittura, le visualizzazioni non causeranno alcun problema. Le persone che sono preoccupate per questo generalmente non dovrebbero esserlo. Quadro di riferimento, dovresti preoccuparti se stai scaricando centinaia di record nella vista senza un aggiornamento.

L'emissione di un intero documento rallenta le cose. Dovresti emettere solo ciò che è necessario per l'uso della vista.

Non sono sicuro di cosa sia val == "% s " le prestazioni sarebbero, ma non dovresti pensare troppo alle cose. Se esiste un array di tag, è necessario emettere i tag. Concesso se ti aspetti un array di tag che conterrà non stringhe, quindi ignoralo.

# Works on CouchDB 0.8.0
from couchdb import Server # http://code.google.com/p/couchdb-python/

byTag = """
function(doc) {
if (doc.type == 'post' && doc.tags) {
    doc.tags.forEach(function(tag) {
        emit(tag, doc);
    });
}
}
"""

def findPostsByTag(self, tag):
    server = Server("http://localhost:1234")
    db = server['my_table']
    return [row for row in db.query(byTag, key = tag)]

La funzione mappa byTag restituisce i dati con ogni tag univoco nella chiave "quot", quindi ogni post con quel tag in valore , quindi quando prendi key = " mytag " ;, lo farà recupera tutti i post con il tag " mytag " ;.

L'ho testato su circa 10 voci e sembra richiedere circa 0,0025 secondi per query, non sono sicuro di quanto sia efficiente con set di dati di grandi dimensioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top