如何控制MongoDB中的文档插入点?

时间:2011-04-01 22:28:06

标签: mongodb

假设我有博客帖子表。我想将所有评论一起存储在博客文章中。 如果1年后对帖子有新评论,我希望将其添加到该集合的最后评论中。 这是为了确保当我阅读该帖子的评论时,我会进行SEEK操作。

否则,如果该帖子分散,我将不得不扫描该帖子的评论。 加上分片/分区可能会将相同帖子的评论放在不同的部分上。

Comments
{
   {post_id: 1, cmt_id:1, usr: 'bob', text: 'Cool!'}
   {post_id: 1, cmt_id:2, usr: 'bob', text: 'Cool!'}
   {post_id: 2, cmt_id:3, usr: 'rob', text: 'Cool!'}
   {post_id: 2, cmt_id:4, usr: 'job', text: 'Cool!'}
}

如果对帖子1有新评论,那么我想要的集合:

Comments
{
   {post_id: 1, cmt_id:1, usr: 'bob', text: 'Cool!'}
   {post_id: 1, cmt_id:2, usr: 'bob', text: 'Cool!'}

   {post_id: 1, cmt_id:5, usr: 'bob', text: 'Cool!'} <-- inserted

   {post_id: 2, cmt_id:3, usr: 'rob', text: 'Cool!'}
   {post_id: 2, cmt_id:4, usr: 'job', text: 'Cool!'}
}

这是可能的还是我还在想SQL?

如果有其他方法具有相同或更好的性能?

感谢阅读。

2 个答案:

答案 0 :(得分:1)

首先你用sql方式思考..在mongodb中实现更好的性能需要嵌入一切。在你的情况下,你应该在博客文章中嵌入评论,如下所示:

Post
{
    _id,
     PostText,
     Comments { cmt_id, usr, text },
     ...
}

在这种情况下,您不需要关心插入位置和可能的问题(来自不同分片中的一个帖子的注释)和分片。

希望这有帮助!

答案 1 :(得分:0)

无论如何,您无法保证评论按顺序存储在磁盘上。如果帖子1得到评论,然后发布2,然后再次发布1评论将在磁盘上交错,评论之间的时间无关紧要。只要您在评论集合上有post_id的索引,加载帖子的所有评论总是很快。

保证注释是连续的唯一方法是将它们添加为子文档,但这是不明智的。首先,它意味着post文档必须经常在磁盘上移动(Mongo中的一个非常昂贵的操作,因为全局写锁定在移动的整个持续时间内保持),其次像注释这样的东西是无限的,因为一个非常受欢迎的帖子,你可以很好地达到文档大小限制,并没有办法添加更多的评论。