Signification de la fonction de carte dans Couchdb-Pythons ViewField
-
28-10-2019 - |
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 Row
s 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 SupportCase
s 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?
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.