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() # 内容
问题:第一个是主贴子表,第二个是评论表,现在要查询出主贴的列表,并且统计出主贴的评论数 有什么好的办法 ?
高洛峰2017-04-21 11:20:37
그냥 내 필요사항에 대해 이야기하는 것뿐입니다. 댓글 수에는 기본 게시물에 추가 필드 속성이 있어야 합니다. 게시물이 인기가 많고 댓글이 수백만 개에 달하는 경우에도 매번 계산해야 하는 이유는 무엇인가요?
迷茫2017-04-21 11:20:37
큰 사람들과 채팅하세요. 여러 가지 방법이 있습니다. 이것은 매우 흥미로운 질문입니다.
현재 스키마 유지
MongoDB의 문서 모델은 조인이 없다고 판단하므로 두 번 쿼리해야 합니다. 사용 중인 Object-Document-Mapper의 구문을 살펴보세요.
게시물에 댓글을 삽입하고 클라이언트 측에서 계산합니다.
쿼리 중에는 전체 문서가 클라이언트로 가져와서 계산됩니다. 데이터 전송의 이 부분은 낭비됩니다. 그러나 단일 게시물이 표시되면 모든 정보를 사용할 수 있습니다. 댓글이 많지 않은 경우 이 스키마를 권장합니다. 하지만 우리는 더 발전할 수 있습니다.
게시물에 댓글을 삽입하고 집계 프레임워크를 사용하여 댓글 수를 계산합니다.
db.posts.aggregate(...), 해제, 그룹을 사용하세요. 이 방법은 좀 과한데요...
게시물에 댓글을 삽입하고 카운팅 캐시를 추가하세요.
위에서 제안한 대로 지금 그대로 유지할 수도 있지만 문서에 있는 경우 업데이트하면 주석 $push
이 주석에 추가되고 $inc
이 동시에 계산되므로 일관성이 매우 잘 유지됩니다. 쿼리할 때 주석 없이 두 번째 투영 매개변수를 작성하면 됩니다. 예를 들어, 가장 가까운 10을 찾으려고 합니다.