我有这个架构:
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。
任何人都有一个很好的解决方案吗?
答案 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
我认为即将推出更多有关架构设计的工作,从长远来看会更有帮助。我认为说实话是最难的。我知道,我花了一些时间来解决与关系模型的差异。