mongodb中节省空间的技巧
各种mongodb服务通过磁盘使用进行计量。在使用mongodb时,有哪些节省空间的技巧mongodb中节省空间的技巧,mongodb,diskspace,Mongodb,Diskspace,各种mongodb服务通过磁盘使用进行计量。在使用mongodb时,有哪些节省空间的技巧 谢谢。这个问题真的很模糊。某些事项可能适用于您,也可能不适用于您(无特定顺序): 缩短详细字段名 以下是一个最好的例子: { surname: "Smith", forename: "John", location: { grid_e: 100.02, grid_n: 450.08 } } 可以通过删除各个字段名称中不必要的字眼来缩短上一个文档 { sn: "Smith",
谢谢。这个问题真的很模糊。某些事项可能适用于您,也可能不适用于您(无特定顺序): 缩短详细字段名 以下是一个最好的例子:
{
surname: "Smith",
forename: "John",
location: { grid_e: 100.02, grid_n: 450.08 }
}
可以通过删除各个字段名称中不必要的字眼来缩短上一个文档
{
sn: "Smith",
fn: "John",
loc: { e: 100.02, n: 450.08 }
}
这将为您节省很小的空间,但它将乘以每个文档的大小(字段的数量)和文档的数量(如果您有数百万个文档,则可能变得非常重要)。下面是一个例子,讨论这种方法的优缺点
封顶收藏
Capped collections允许您指定要存储的文档数量限制。它以先进先出的方式工作(最旧的文档将被丢弃)。如果您正在记录并希望存储最新的x
文档,但旧文档与此无关,则这一点尤其适用
使用capped集合有一些注意事项。有关详细信息,请参阅
考虑文档之间的关系
文档可以具有嵌入文档或与其他文档(在其他集合中)的关系外键样式。每种方法的优点和缺点是不同的,但最终由您选择适合您的方法
以博客为例,可能每个博客文章都有一位作者。您可以将此作者信息嵌入到每篇文章中,也可以选择将其放入自己的作者
或用户
集合中。后一种方法可以节省空间,特别是如果许多用户经常发很多帖子(而不是一两篇)。请注意,由于没有联接,您将招致额外的数据库调用
编辑:在关系上展开
除了嵌入文档外,还可以通过几种方式实现文档之间的关系。您可以像这样使用相关文档的ID(重用上面的博客示例):
这可能是处理关系的最简单方法(除了嵌入关系),但完全由您在自己的代码中维护它。您需要在需要时调用以获取相关用户,并在必要时进行更新。也就是说,我看不出这种方法有什么错,并且已经在一些场合使用过
类似的方法是使用DBRef。这是一种更为正式的描述上述关系的方法。不只是将另一个文档的ID放入,而是指定一个DBRef,它是对另一个文档的一种形式化引用。我希望这是有道理的。我在这里描述的两种方法都在mongodb文档中。值得注意的是,手动引用将比DBRef占用(稍微)更少的空间,因为DBRef包含额外的(可能是冗余的)信息,例如引用哪个集合。它的优点是许多驱动程序库都支持它,因此它让您的生活变得更轻松
归根结底,什么方法有效和相关取决于你想做什么。考虑选择,权衡,并作出关于它是否是你应该做的调用。和实验。如果存储大量不需要搜索的数据,请尽量避免重复数据,并可能使用某种形式的压缩。我认为最好的方法是使用一个文档来存储相关数据
例如,如果你有用户集合,你可以给每个用户提供文档,并在该文档中植入其他东西,如头像或acl和其他东西@Xenotheracide:我当然希望你这样做,这是完全没有帮助的,完全没有帮助的压缩建议?不幸的是,我自己没有做过任何进程内压缩。如果您想存储文本体(例如),压缩方法可能合适吗?从各种语言(、、…)中找到有关使用它的资源似乎相对容易。可能适合你,取决于你想做什么。谢谢你的好帖子。我知道文档关系是一个很流行的话题,但是为了这个答案是一个综合性的资源,你能在这里用例子再重复一遍吗?谢谢。奇怪的是,我总是说额外收集磁盘空间是为了更好的性能。想象一下,想要查询某个用户的所有博客帖子、评论、论坛帖子、投票等。(如图形查询)。如果有一个用户集合引用了所有这些东西,那么这就很好了。这会产生一点磁盘空间开销,但通过使用更高效的ID以及不存储文本键来补偿损失,mongodb中的磁盘空间似乎还有很大的改进空间。无论什么能让你的船漂浮。。。
{
_id: <whatever>,
title: "Document Relationships in MongoDB",
body: "bla bla bla bla",
// ...
user_id: <id of the user document>
}
{
_id: <whatever>,
name: "Mark Embling",
email: "example@markembling.info",
///...
}