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() # 内容
问题:第一个是主贴子表,第二个是评论表,现在要查询出主贴的列表,并且统计出主贴的评论数 有什么好的办法 ?
單純說裡的需求。評論數應該是在主貼那有個附加欄位屬性的。為什麼每次都count?要有個帖子很火幾百萬評論,你還要count?
跟大牛們聊了一下。有以下幾種辦法。這是個挺有趣的問題。
保持現在的schema
MongoDB的文檔模型決定了它沒有Join,所以只好查詢兩次了。看看你用的 Object-Document-Mapper 的語法。
把comments嵌入在post中,客戶端計數。
Query的時候把整份文件都拿到client來,數數。浪費了這部分資料傳輸。但在單一post的顯示的時候,所有資訊都有了。如果你的comment不多,這種schema是推薦的方法。但是我們可以進一步改進。
把comments嵌入在post中,用aggregation framework計數。
用db.posts.aggregate(...),unwind, group。這個方法有點overkilling了…
把comments嵌入在post中,加個計數的快取。
也可以像樓上建議的那樣,保持現在的樣子,不過如果他們在一個doc裡,一個update把comment
$push
到comments里,同时$inc
計數,很好地保持了一致性。查詢的時候,把第二個projection參數寫出來,不要comments就好了。比如想找最近的10個。我查找了大量的資料,最後還是單獨增加一個統計屬性