mongodb 联合查询问题
高洛峰
高洛峰 2017-04-21 11:18:37
0
3
600
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()                          # 内容

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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(3)
小葫芦

單純說裡的需求。評論數應該是在主貼那有個附加欄位屬性的。為什麼每次都count?要有個帖子很火幾百萬評論,你還要count?

迷茫

跟大牛們聊了一下。有以下幾種辦法。這是個挺有趣的問題。

  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)
伊谢尔伦

我查找了大量的資料,最後還是單獨增加一個統計屬性

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板