mongodb 联合查询问题

 mobiledu2502862707 发布于 2022-10-29 08:26
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()                          # 内容

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

3 个回答
  • 我查找了大量的资料,最后还是单独增加一个统计属性

    2022-11-12 01:44 回答
  • 跟大牛们聊了一下。有以下几种办法。这是个挺有意思的问题。

    1. 保持现在的schema
      MongoDB的文档模型决定了它没有Join,所以只好查询两次了。看看你用的 Object-Document-Mapper 的语法吧。

    2. 把comments嵌入在post中,客户端计数。
      Query的时候把整个文档都拿到client来,计数。浪费了这部分数据传输。但在单个post的显示的时候,所有信息都有了。如果你的comment不多,这种schema是推荐的办法。但是我们可以进一步改进。

    3. 把comments嵌入在post中,用aggregation framework计数。
      用db.posts.aggregate(...),unwind, group。这个方法有点overkilling了……

    4. 把comments嵌入在post中,加个计数的缓存。
      也可以像楼上建议的那样,保持现在的样子,不过如果他们在一个doc里,一个update把comment $push到comments里,同时$inc计数,很好地保持了一致性。查询的时候,把第二个projection参数写出来,不要comments就好了。比如想找最近的10个。

    db.posts.find({}, { comments: -1 }).sort({"when": -1}).limit(10)
    
    2022-11-12 01:44 回答
  • 单纯说里的需求。评论数应该是在主贴那有个附加字段属性的。为什么每次都count?要有个帖子很火几百万评论,你还要count?

    2022-11-12 01:44 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有