Pergunta

Eu estou usando a função a seguir vista a iteração sobre todos os itens no banco de dados (a fim de encontrar uma tag), mas acho que o desempenho é muito pobre, se o conjunto de dados é grande. Qualquer outra abordagem?

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
Foi útil?

Solução

Disclaimer: eu não testar isso e não sei se ele pode executar melhor

.

Criar uma visão única perm:

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

E consulta com _view / your_view / all? StartKey = [ 'your_tag_here'] & endkey = [ 'your_tag_here', {}]

Resultando estrutura JSON será um pouco diferente, mas você ainda vai ter a data de classificação publicar.

Outras dicas

Você pode definir uma única exibição permanente, como Bahadir sugere. ao fazer este tipo de indexação, porém, não saída do doc para cada chave. Em vez disso, libertam ([tag, doc.published], nulos). Em versões versão atual você então tem que fazer uma pesquisa separada para cada documento, mas SVN tronco agora tem suporte para a especificação "include_docs = true" na cadeia de consulta e CouchDB irá mesclar automaticamente os documentos em sua visão para você, sem a espaço aéreo.

Você está muito no caminho certo com a vista. Uma lista de pensamentos no entanto:

Ver geração é incremental. Se você é o tráfego de leitura é maior do que você está tráfego de gravação, em seguida, seus pontos de vista não irá causar um problema em tudo. As pessoas que estão preocupadas com isso geralmente não deve ser. Quadro de referência, você deve estar preocupado se você está despejar centenas de registros na vista sem uma atualização.

Emitindo um documento inteiro irá retardar as coisas. Você só deve emitir o que é necessário para o uso da vista.

Não sei o que o val == "% s" desempenho seria, mas você não deve mais pensar sobre as coisas. Se há uma matriz tag você deve emitir os tags. Concedido, se você espera uma matriz tags que irá conter não-cordas, então ignorar isso.

# 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)]

A função de mapa byTag retorna os dados com cada marca única no "chave", em seguida, cada post com essa tag em value, por isso, quando você pegar key = "mytag", ele irá recuperar todos os posts com a "mytag" tag .

Eu testei-o contra cerca de 10 entradas e parece demorar cerca de 0,0025 segundos por consulta, não tenho certeza o quão eficiente é com grandes conjuntos de dados ..

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top