찾다

 >  Q&A  >  본문

mongodb 联合查询问题

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()                          # 内容

问题:第一个是主贴子表,第二个是评论表,现在要查询出主贴的列表,并且统计出主贴的评论数 有什么好的办法 ?

高洛峰高洛峰2765일 전603

모든 응답(3)나는 대답할 것이다

  • 高洛峰

    高洛峰2017-04-21 11:20:37

    그냥 내 필요사항에 대해 이야기하는 것뿐입니다. 댓글 수에는 기본 게시물에 추가 필드 속성이 있어야 합니다. 게시물이 인기가 많고 댓글이 수백만 개에 달하는 경우에도 매번 계산해야 하는 이유는 무엇인가요?

    회신하다
    0
  • 迷茫

    迷茫2017-04-21 11:20:37

    큰 사람들과 채팅하세요. 여러 가지 방법이 있습니다. 이것은 매우 흥미로운 질문입니다.

    1. 현재 스키마 유지
      MongoDB의 문서 모델은 조인이 없다고 판단하므로 두 번 쿼리해야 합니다. 사용 중인 Object-Document-Mapper의 구문을 살펴보세요.

    2. 게시물에 댓글을 삽입하고 클라이언트 측에서 계산합니다.
      쿼리 중에는 전체 문서가 클라이언트로 가져와서 계산됩니다. 데이터 전송의 이 부분은 낭비됩니다. 그러나 단일 게시물이 표시되면 모든 정보를 사용할 수 있습니다. 댓글이 많지 않은 경우 이 스키마를 권장합니다. 하지만 우리는 더 발전할 수 있습니다.

    3. 게시물에 댓글을 삽입하고 집계 프레임워크를 사용하여 댓글 수를 계산합니다.
      db.posts.aggregate(...), 해제, 그룹을 사용하세요. 이 방법은 좀 과한데요...

    4. 게시물에 댓글을 삽입하고 카운팅 캐시를 추가하세요.
      위에서 제안한 대로 지금 그대로 유지할 수도 있지만 문서에 있는 경우 업데이트하면 주석 $push이 주석에 추가되고 $inc이 동시에 계산되므로 일관성이 매우 잘 유지됩니다. 쿼리할 때 주석 없이 두 번째 투영 매개변수를 작성하면 됩니다. 예를 들어, 가장 가까운 10을 찾으려고 합니다.

    으아아아

    회신하다
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-21 11:20:37

    많은 정보를 검색하다가 드디어 별도의 통계 속성을 추가했습니다

    회신하다
    0
  • 취소회신하다