Question

J'utilise le Couchdb.mapping dans l'un de mes projets. J'ai une classe appelée SupportCase dérivé de Document Cela contient tous les champs que je veux.

Ma base de données (appelée admin) contient plusieurs types de documents. j'ai un type champ dans tous les documents que j'utilise pour les distinguer. J'ai de nombreux documents de type "case" que je veux utiliser une vue. J'ai un document de conception appelé support Avec une vue à l'intérieur, il a appelé cases. Si je demande les résultats de cette vue en utilisant db.view("support/cases), Je reviens une liste de Rows qui ont ce que je veux.

Cependant, je veux en quelque sorte avoir cela enveloppé par le SupportCase classe afin que je puisse appeler une seule fonction et récupérer une liste de tous les SupportCases dans le système. J'ai créé un ViewField propriété

@ViewField.define('cases')
def all(self, doc):
    if doc.get("type","") == "case":
        yield doc["_id"], doc

Maintenant, si j'appelle SupportCase.all(db), Je reviens tous les cas.

Ce que je ne comprends pas, c'est si ce point de vue est pré-composé et stocké dans la base de données ou fait à la demande similaire à db.query. Si c'est ce dernier, ça va être lent et je veux utiliser une vue pré-composée. Comment je fais ça?

Était-ce utile?

La solution

Je pense que ce dont vous avez besoin est:

@classmethod
def all(cls):
    result = cls.view(db, "support/all", include_docs=True)
    return result.rows

Document La classe a une ClassMethod view qui enroule les lignes par classe sur laquelle on l'appelle. Alors le suivant vous renvoie un ViewResult avec des rangées de type SupportCase et à prendre .rows Cela donne une liste de cas de soutien.

SupportCase.view(db, viewname, include_docs=True)

Et je ne pense pas que vous deviez entrer dans la magie de Viewfield. Mais permettez-moi d'expliquer comment cela fonctionne. Considérez l'exemple suivant du CouchDB-python Documentation.

class Person(Document):
     @ViewField.define('people')
     def by_name(doc):
         yield doc['name'], doc

Je pense que cela équivaut à:

class Person(Document):
    @classmethod
    def by_name(cls, db, **kw):
        return cls.view(db, **kw)

Avec la fonction d'origine attachée à People.by_name.map_fun.

Autres conseils

La fonction MAP est en quelque sorte analogue à un index dans une base de données relationnelle. Cela ne se fait plus à chaque fois, et lorsque de nouveaux documents sont ajoutés, la façon dont il est mis à jour ne nécessite pas que tout soit refait (c'est une sorte de structure d'arbre).

Cela a un assez bon sommaire

ViewField utilise une vue prédéfinie, une fois construite, sera rapide. Il n'utilise certainement pas de vue temporaire.

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