gpt4 book ai didi

mongodb - 在 MongoDB 中,将帖子的所有评论保存在一个文档中是否可行?

转载 作者:IT老高 更新时间:2023-10-28 13:19:57 25 4
gpt4 key购买 nike

我已阅读基于文档的 dbs 的描述,例如,如果您愿意,可以将所有评论嵌入到与帖子相同的文档中的帖子下:

{
_id = sdfdsfdfdsf,
title = "post title"
body = "post body"
comments = [
"comment 1 ......................................... end of comment"
.
.
n
]
}

我遇到了类似的情况,每条评论可能高达 8KB,而每条帖子可能有多达 30 条评论。

尽管在同一个文档中嵌入注释很方便,但我想知道大型文档是否会影响性能,尤其是当 MongoDb 服务器和 http 服务器运行在不同的机器上并且必须通过 LAN 通信时?

最佳答案

在其他一些答案之后发布此答案,因此我将重复提到的一些内容。

也就是说,有一些事情需要考虑。考虑这三个问题:

  1. 是否每次查询帖子时都需要所有评论?
  2. 您是否要直接查询评论(例如查询特定用户的评论)?
  3. 您的系统使用率会相对较低吗?

如果所有问题都可以用"is"回答,那么您可以嵌入评论数组。在所有其他情况下,您可能需要一个单独的集合来存储您的评论。

首先,您实际上可以以并发安全的方式自动更新和删除注释(请参阅使用位置运算符的更新),但有些事情您不能做,例如基于索引的插入。

对任何类型的大型集合使用嵌入式数组的主要问题是移动更新问题。 MongoDB 为每个文档保留一定数量的填充(参见 db.col.stats().paddingFactor)以允许它根据需要增长。如果它用完了这个填充(它通常会出现在你的用例中),它将不得不在磁盘上移动那个不断增长的文档。这使得更新速度变慢了一个数量级,因此对高带宽服务器来说是一个严重的问题。一个相关但不太重要的问题是带宽。如果您别无选择,只能查询整个帖子及其所有评论,即使您只显示前 10 条,您将浪费相当多的带宽,这在云环境中尤其是一个问题(您可以使用 $切片以避免其中一些)。

如果你确实想嵌入这里是你的基本操作:

添加评论:

db.posts.update({_id:[POST ID]}, {$push:{comments:{commentId:"remon-923982", author:"Remon", text:"Hi!"}}})

更新评论:

 db.posts.update({_id:[POST ID], 'comments.commentId':"remon-923982"}, {$set:{'comments.$.text':"Hello!"}})

删除评论

db.posts.update({_id:[POST ID], 'comments.commentId':"remon-923982"}, {$pull:{comments:{commentId:"remon-923982"}}})

所有这些方法都是并发安全的,因为更新条件是(进程范围的)写锁的一部分。

话虽如此,您可能想要一个专门的评论收藏集,但这有第二个选择。您可以将每条评论存储在专用文档中,也可以使用评论桶,例如,每条评论 20-30 条(在此处详细描述 http://www.10gen.com/presentations/mongosf2011/schemascale)。这有优点和缺点,所以由你决定哪种方法最适合你想做的事情。如果您每篇文章的评论可能超过几百条,我会选择存储桶,因为您需要分页它们的 skip(N) 游标方法的 o(N) 性能。在所有其他情况下,只需使用每个文档的评论方法。这对于查询其他用例的评论也是最灵活的。

关于mongodb - 在 MongoDB 中,将帖子的所有评论保存在一个文档中是否可行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11077202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com