mongodb中节省空间的技巧

mongodb中节省空间的技巧,mongodb,diskspace,Mongodb,Diskspace,各种mongodb服务通过磁盘使用进行计量。在使用mongodb时,有哪些节省空间的技巧 谢谢。这个问题真的很模糊。某些事项可能适用于您,也可能不适用于您(无特定顺序): 缩短详细字段名 以下是一个最好的例子: { surname: "Smith", forename: "John", location: { grid_e: 100.02, grid_n: 450.08 } } 可以通过删除各个字段名称中不必要的字眼来缩短上一个文档 { sn: "Smith",

各种mongodb服务通过磁盘使用进行计量。在使用mongodb时,有哪些节省空间的技巧


谢谢。

这个问题真的很模糊。某些事项可能适用于您,也可能不适用于您(无特定顺序):

缩短详细字段名 以下是一个最好的例子:

{
    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",
    ///...
}