class Subject(Document):
'''
新闻主题信息
'''
author_ref = ReferenceField(Account,dbref=False) #关联用户
when = DateTimeField(default=datetime.datetime.now, required=True)
title = StringField(max_length=50) ` # 文章标题
`
class Comment(Document):
'''
评论
'''
subject_ref = ReferenceField(Subject,dbref=False) #关联主题
display_name = StringField(max_length=50)
author_ref = ReferenceField(Account,dbref=False)
content = StringField() # 内容
问题:第一个是主贴子表,第二个是评论表,现在要查询出主贴的列表,并且统计出主贴的评论数 有什么好的办法 ?
Je parle juste de mes besoins. Le nombre de commentaires doit avoir un attribut de champ supplémentaire sur la publication principale. Pourquoi faut-il compter à chaque fois ? Si une publication est très populaire et compte des millions de commentaires, faut-il quand même compter ?
Discutez avec les grands. Il existe plusieurs façons. C'est une question très intéressante.
Conserver le schéma actuel
Le modèle de document de MongoDB détermine qu'il n'a pas de jointure, il doit donc être interrogé deux fois. Jetez un œil à la syntaxe de l’Object-Document-Mapper que vous utilisez.
Intégrez les commentaires dans la publication et comptez-les côté client.
Lors de la requête, l'intégralité du document est apportée au client et comptée. Cette partie du transfert de données est inutile. Mais lorsqu’un seul article est affiché, toutes les informations sont disponibles. Si vous n’avez pas beaucoup de commentaires, ce schéma est l’approche recommandée. Mais nous pouvons encore nous améliorer.
Intégrez les commentaires dans la publication et utilisez le cadre d'agrégation pour les compter.
Utilisez db.posts.aggregate(...), déroulez, groupez. Cette méthode est un peu exagérée...
Intégrez les commentaires dans la publication et ajoutez un cache de comptage.
Vous pouvez également le conserver tel quel comme suggéré ci-dessus, mais s'ils sont dans un doc, une mise à jour mettra le commentaire
$push
en commentaires, et comptera également$inc
, ce qui maintient très bien la cohérence. Lors de l'interrogation, écrivez simplement le deuxième paramètre de projection sans commentaires. Par exemple, vous souhaitez trouver le nombre 10 le plus proche.J'ai recherché beaucoup d'informations et j'ai finalement ajouté un attribut statistique distinct