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

Kev*_*vin 6 paging mongoose mongodb nosql mongodb-query

我有这个架构:

article: {
    subject,
    comments: []
}
Run Code Online (Sandbox Code Playgroud)

如果我有8条评论,并且查询

 article.find({}, {
     comments: {
         $slice: [ -10, 5 ]
     }
 });
Run Code Online (Sandbox Code Playgroud)

我从索引0到索引4得到注释,
但我只希望因为分页而返回从索引0到索引2的注释.
(第1页$ slice [-5,5]从索引3到索引7,第2页$ slice [-10,5]从索引0到索引2)

现在我必须传递另一个参数"lastId"来比较每个注释并删除"_id"<"lastId",但我认为它有点hacky.

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

小智 15

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

当您将嵌入的文档添加到不是固定大小的数组时,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

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