6

我有这个架构:

article: {
    subject,
    comments: []
}

如果我有 8 条评论,然后查询

 article.find({}, {
     comments: {
         $slice: [ -10, 5 ]
     }
 });

我得到了从索引 0 到索引 4 的
评论,但我只想返回从索引 0 到索引 2 的评论,因为分页。
(第 1 页 $slice[ -5, 5 ] 从索引 3 到索引 7,第 2 页 $slice[ -10, 5 ] 从索引 0 到索引 2)

现在我必须传递另一个参数“lastId”来比较每个评论并删除“_id”<“lastId”,但我认为这有点hacky。

有人对此有很好的解决方案吗?

4

1 回答 1

16

所以我要说的是,您应该切换架构以将注释作为单独的文档留下,因为这是一个未绑定的数组,它将使您的查询更有效率。我会解释的。

当您将嵌入式文档添加到不是固定大小的数组时,mongoDB 可能需要随着文档的增长而移动文档,更改填充因子并导致碎片(填充因子是 mongodb 方面的猜测,您的文档将有多大增长,它会为这种情况预先分配更多空间)。

您也被限制为 16MB 的公关文件,所以想象一下,如果您收到一个疯狂的热门话题,或者您决定使用其他元数据扩展评论,那么您将打破这个障碍是可行的。检索大文档也是昂贵且耗时的。

一般来说,如果嵌入的文档不是未绑定的数组,它们就很棒。因此,保留前 10 条评论的列表会很好,但保留 1000 多条评论是不好的。

下面有一些很好的介绍

http://www.10gen.com/presentations/mongodb-berlin/2012/10-key-performance-indicators http://www.10gen.com/presentations/mongosv-2011/schema-design-by-example

我认为很快就会有更多关于模式设计的工作,从长远来看会更有帮助。我认为诚实是最难的。我知道,我花了一段时间才弄清楚与关系模型的区别。

于 2012-05-03T09:54:18.300 回答