我们的应用程序允许用户创建帖子和评论。数据增长很快,我们已经回顾了Mongodb的扩展策略。我们喜欢http://www.10gen.com/presentations/mongosf2011/schemascale中提出的方法,该方法在嵌入式和非嵌入式文档之间使用混合模式,对注释进行分类,以便每个文档以100或200条注释为一组进行保存。
{
"_id" : '/post/2323423/1--1',
"comments" : [{
"author" : "peter",
"text" : "comment!",
"when" : "June 24 2012,
"votes": 43
},
{
"author" : "joe",
"text" : "hi!",
"when" : "June 25 2012,
"votes": 102
},
...
], }
通过打包评论,显示数千条评论所需的磁盘读取次数更少,同时,文档保持较小,因此写入速度更快。它非常适合对按日期排序的评论进行分页。
我们对这种方法非常感兴趣,但我们的应用程序要求注释按投票和子注释排序。
目前,我们使用非嵌入式方法,对注释使用单独的集合。允许我们检索按任何字段排序的数据,子注释很容易(通过引用),但性能正在成为一个问题。我们想使用bucketing,但按投票排序的事情似乎不适合一个桶。
按日期排序是微不足道的,当用户点击“下一页”时,只需转到下一个存储桶,查询一个文档。但是,如果我们想要按选票排序,我们如何做到这一点呢?我们必须检索所有的存储桶,然后对评论进行排序,这显然是无效的……
有没有关于如何设计合适的模式来实现这一点的想法?
发布于 2012-08-21 21:57:37
您应该能够按降序进行排序:
db.collection.find({},{_id:0}).sort({'comments.votes':1})
只需注意,其中有一个错误,您只能按升序排序。查看此bug ticket
发布于 2017-02-04 08:30:10
您是否尝试过聚合查询?
db.commentbuckets.aggregate([
$match: {discussion_id: <discussion_id>},
$unwind: "$comments",
$sort: {votes: -1}
]);https://stackoverflow.com/questions/12055541
复制相似问题