MongoDB$slice(嵌入式阵列分页)

MongoDB$slice(嵌入式阵列分页),mongodb,mongoose,mongodb-query,paging,nosql,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) 现在,我必须传递另一个参数“la

我有这个模式:

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”来比较每个注释,并删除“\u id”<“lastId”,但我认为这有点老套


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

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

当您将嵌入文档添加到非固定大小的数组中时,mongoDB可能需要在文档增长时移动文档,从而更改填充因子并导致碎片(填充因子是mongoDB对文档增长大小的猜测,它会为这种情况预分配更多空间)

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

一般来说,如果嵌入的文档不是未绑定的数组,那么它们是很好的。因此,保留前10条评论的列表将非常有用,但保留1000多条评论是不好的

下面有一些很好的介绍


我认为不久将有更多关于模式设计的工作,从长远来看,这将更有帮助。我认为诚实是最难的。我知道,我花了一段时间才意识到与关系模型的区别。

注释不是长文本和大量内容,因此每个文档16MB就足够了。我真正担心的是灵活性和效率。因此,将注释(或任何其他未绑定的数组)存储为嵌入式文档确实是一种糟糕的方法,对吗?有些查询很难使用嵌入式文档,例如,提供特定用户的所有注释。一般来说,这是一个反规范化的好例子,我同意你的观点。但我也认为嵌入与否取决于应用程序需要什么,如果我不需要其他字段的查询注释,而只需要文章的查询注释(换句话说,注释总是与文章一起出现),我更喜欢在文章文档中嵌入注释数组。是的,我认为这是一个有效的案例,我只是想确保您了解与不断增长的嵌入文档相关的权衡和潜在问题。只要你知道这一点,并在知情的情况下做出权衡:)。