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

时间:2012-05-03 02:40:49

标签: mongodb mongoose mongodb-query paging nosql

我有这个架构:

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。

任何人都有一个很好的解决方案吗?

1 个答案:

答案 0 :(得分:13)

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

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

你也只限于16MB的pr文件,所以想象一下如果你得到一个疯狂的流行线程,或者你决定用其他元数据扩展评论,那么你就可以打破这个障碍。检索大文档也很昂贵且耗时。

通常,如果嵌入式文档不是未绑定的数组,那么它们就很棒。因此,保留前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

我认为即将推出更多有关架构设计的工作,从长远来看会更有帮助。我认为说实话是最难的。我知道,我花了一些时间来解决与关系模型的差异。