Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB设计与缓存理论_Mongodb_Nosql - Fatal编程技术网

MongoDB设计与缓存理论

MongoDB设计与缓存理论,mongodb,nosql,Mongodb,Nosql,数据结构可能如下所示: { post_title : String, post_date : Date, user_id : ObjectID, post_content : String, comments : [ { comment_date : Date, comment_content : String, user_id : O

数据结构可能如下所示:

{
 post_title : String,
 post_date  : Date,
 user_id    : ObjectID,
 post_content : String,
 comments   : [
                {
                  comment_date : Date,
                  comment_content : String,
                  user_id : ObjectID
                 }
                ]
}
我正在研究的系统具有与上述类似的结构。post_*对象中包含的内容可能永远不会更改,但comments部分中的内容将经常更新和编辑

由于上述结构是单个文档,更新或添加单个注释需要阅读整个文档,编辑并保存它。这也使得缓存变得困难,因为尽管帖子内容可以缓存很长时间,但评论却不能

这里最好的策略是什么?给自己收藏的评论好吗


就查询时间而言,我仍然需要点击数据库来提取注释,但在更新或添加注释时,文档的大小将大大减小。

在Mongo中,您可以附加到数组而不必读取它。请参阅命令。在缓存方面没有帮助,但它消除了在更新文档之前读取文档的需要。

在Mongo中,您可以附加到数组而不读取它。请参阅命令。在缓存方面没有帮助,但它消除了在更新文档之前阅读文档的需要。

在嵌套集合中存储注释有什么意义?我建议您使用另一个集合来对DBRef进行注释,甚至手动引用

文档的大小不是唯一的问题。(我认为这根本不是问题) 其中一个常见任务是向用户显示最后N条评论。你的结构很难处理


我在应用程序中使用了您的结构,后来我不得不用独立集合重写它

在嵌套集合中存储注释有什么意义?我建议您使用另一个集合来对DBRef进行注释,甚至手动引用

文档的大小不是唯一的问题。(我认为这根本不是问题) 其中一个常见任务是向用户显示最后N条评论。你的结构很难处理


我用你的结构来做我的应用程序,后来我不得不用独立的集合[/P>>P]重写它。另一件需要考虑的事情是:你提前知道你的“注释”数组会变成多大吗?

每个mongo文档的大小限制为16mb。这很少是一个问题,但需要记住,这也是避免将子文档“无限”添加到嵌入式数组的原因

此外,Mongo预先分配了文档增长的空间。(有关更多信息,请参阅关于“填充因子”的文档:)如果将足够多的嵌入文档推送到一个数组中,导致文档超出其在磁盘上的预分配插槽,则整个文档将必须移动到磁盘上的其他位置。您可能会发现这会导致不需要的diskIO

如果您预期每个文档将具有最大数量的嵌入文档,则通常的做法是在添加新文档时预填充新文档数组。例如,如果您预计每篇文章都会有100条评论,那么最佳做法是使用“评论”数组创建新的文章文档,该数组包含100个包含“垃圾”数据的嵌入文档。创建新文档后,磁盘空间将被预先分配,垃圾数据可能会被删除,从而为文档的大小增加留出空间


希望在设计文档结构时,这能给您提供一些额外的思考素材 每个mongo文档的大小限制为16mb。这很少是一个问题,但需要记住,这也是避免将子文档“无限”添加到嵌入式数组的原因

此外,Mongo预先分配了文档增长的空间。(有关更多信息,请参阅关于“填充因子”的文档:)如果将足够多的嵌入文档推送到一个数组中,导致文档超出其在磁盘上的预分配插槽,则整个文档将必须移动到磁盘上的其他位置。您可能会发现这会导致不需要的diskIO

如果您预期每个文档将具有最大数量的嵌入文档,则通常的做法是在添加新文档时预填充新文档数组。例如,如果您预计每篇文章都会有100条评论,那么最佳做法是使用“评论”数组创建新的文章文档,该数组包含100个包含“垃圾”数据的嵌入文档。创建新文档后,磁盘空间将被预先分配,垃圾数据可能会被删除,从而为文档的大小增加留出空间

希望在设计文档结构时,这能给您提供一些额外的思考素材