MongoDB $slice(嵌入式数组分页)

问题描述 投票:0回答:1

我有这个架构:

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", but I think it is a little hacky.

谁有好的解决方案吗?

mongodb mongoose pagination mongodb-query nosql
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

我认为模式设计方面即将开展更多工作,从长远来看将更有帮助。我认为诚实是最难的。我知道,我花了一段时间才理解关系模型与关系模型的差异。

© www.soinside.com 2019 - 2024. All rights reserved.