Question

J'utilise la fonction d'affichage suivante pour parcourir tous les éléments de la base de données (afin de trouver une balise), mais je pense que les performances sont très médiocres si l'ensemble de données est volumineux. Une autre approche?

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
Était-ce utile?

La solution

Avertissement: je n'ai pas testé cela et je ne sais pas s'il peut fonctionner mieux.

Créer une seule vue permanente:

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

Et interroger avec _view / your_view / all? startkey = ['your_tag_here'] & endkey = ['your_tag_here', {}]

La structure JSON obtenue sera légèrement différente, mais vous obtiendrez toujours le tri de la date de publication.

Autres conseils

Vous pouvez définir une seule vue permanente, comme le suggère Bahadir. Cependant, lorsque vous utilisez ce type d’indexation, ne ne publiez pas le document pour chaque clé. Au lieu de cela, émettez ([tag, doc.published], null). Dans les versions actuelles, vous devrez alors effectuer une recherche distincte pour chaque document, mais la ligne de réseau SVN prend désormais en charge la spécification de "include_docs = True". dans la chaîne de requête et CouchDB fusionnera automatiquement les documents dans votre vue pour vous, sans encombrement.

Vous êtes vraiment sur la bonne voie avec la vue. Une liste de réflexions cependant:

La génération de vues est incrémentielle. Si votre trafic en lecture est supérieur à votre trafic en écriture, vos vues ne poseront aucun problème. Les gens qui s’inquiètent de cela ne devraient généralement pas l'être. Cadre de référence, vous devriez vous inquiéter si vous versez des centaines d'enregistrements dans la vue sans mise à jour.

L'émission d'un document entier ralentira les choses. Vous ne devez émettre que ce qui est nécessaire pour utiliser la vue.

Vous ne savez pas exactement ce que val == "% s" la performance serait, mais vous ne devriez pas trop penser aux choses. S'il existe un tableau de balises, vous devez les émettre. Accordé si vous attendez un tableau de balises contenant des non-chaînes, alors ignorez-le.

# 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 fonction de mappe byTag renvoie les données avec chaque balise unique dans la "clé", puis chaque publication avec cette balise dans la valeur . Ainsi, lorsque vous récupérez la clé = "mytag", récupérer tous les messages avec le tag "mytag".

Je l'ai testé sur environ 10 entrées et cela semble prendre environ 0,0025 secondes par requête, sans savoir à quel point il est efficace avec des ensembles de données volumineux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top