2

我们的应用程序允许用户创建帖子和评论。数据正在快速增长,我们已经回顾了 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
              },
              ...
     ], 

}

通过对评论进行分桶,显示数千条评论所需的磁盘读取次数更少,同时文档保持较小,因此写入速度很快。对按日期排序的评论进行分页是完美的。

我们对这种方法非常感兴趣,但我们的应用程序要求评论按投票和子评论排序。

目前我们使用非嵌入式方法,它使用单独的评论集合。允许我们检索按任何字段排序的数据并且子注释很容易(通过引用),但性能正在成为一个问题。我们想使用分桶,但按投票排序的东西似乎不适合桶。

按日期排序是微不足道的,只需在用户单击“下一页”时转到下一个存储桶,查询一个文档。但是,如果我们想按选票排序,我们如何做到这一点?我们必须检索所有存储桶,然后对评论进行排序,这显然是无效的......

关于适当的模式设计来实现这一点的任何想法?

4

2 回答 2

0

您应该能够按降序排序:

db.collection.find({},{_id:0}).sort({'comments.votes':1})

请注意,有一个错误,您只能按升序排序。看到这个错误票

于 2012-08-21T13:57:37.440 回答
0

您是否尝试过聚合查询?

db.commentbuckets.aggregate([
    $match: {discussion_id: <discussion_id>},
    $unwind: "$comments",
    $sort: {votes: -1}
]);
于 2017-02-04T00:30:10.200 回答