节省mongodb空间的技巧

时间:2010-11-26 15:44:20

标签: mongodb diskspace

各种mongodb服务通过磁盘使用。使用mongodb时有哪些节省空间的技巧?

感谢。

3 个答案:

答案 0 :(得分:11)

这个问题实在太模糊了。某些可能适用于您的内容(不按特定顺序):

缩短详细字段名称

最好用一个例子来说明:

{
    surname: "Smith",
    forename: "John",
    location: { grid_e: 100.02, grid_n: 450.08 }
}

可以通过删除各种字段名称中不必要的冗长来缩短之前的文档。

{
    sn: "Smith",
    fn: "John",
    loc: { e: 100.02, n: 450.08 }
}

这将为您节省非常小的空间,但它将乘以每个文档的大小(字段数)和文档数量(如果您有数百万,可能会变得很重要)。这是superb post讨论这种方法的好处和缺点。

上限收藏

加盖的集合允许您指定要存储的文档数量限制。它以先进先出的方式工作(最旧的文档将被丢弃)。如果您正在记录并希望存储最新的x文档,但这些文档与旧文档无关,则此功能尤其适用。

使用上限集合有一些注意事项。有关详细信息,请参阅MongoDB docs

考虑您的文件关系

文档可以包含嵌入文档或与其他文档(在其他集合中)的外键样式的关系。每种方法的优缺点是discussed frequently,但最终您可以选择适合您的方法。

以博客为例,可能每篇博文都有作者。您可以在每个帖子中嵌入此作者信息,也可以选择将它们放在自己的authorsusers集合中。后一种方法可以节省空间,特别是如果许多用户经常发布许多帖子(而不仅仅是一两个)。请注意,由于没有连接,您将需要额外的数据库调用。

编辑:扩展关系

除了嵌入文档之外,文档之间的关系可以通过几种方式完成。您可以像这样使用相关文档的ID(重用上面的博客示例):

{
    _id: <whatever>,
    title: "Document Relationships in MongoDB",
    body: "bla bla bla bla",
    // ...
    user_id: <id of the user document>
}

users集合中,该相关文档将存在:

{
    _id: <whatever>,
    name: "Mark Embling",
    email: "example@markembling.info",
    ///...
}

这可能是最简单的关系方法(除了嵌入它们之外),但是你可以在你自己的代码中完全维护它。您需要进行调用以在需要时抓取相关用户,并在可能需要时更新它。也就是说,我认为这种方法没有任何问题,并且已经在一些情况下使用过它。

类似的方法是使用DBRef。这是描述如上所述关系的更正式的方法。您可以指定DBRef,而不仅仅是将其他文档的ID放入其中,DBRef是对另一个文档的一种引用,形式化。我希望这是有道理的。我在这里描述的两种方法都是mongodb文档中的discussed in detail。值得注意的是,手动引用将占用(略微)比DBRef更小的空间,因为DBRef保存额外(可能是冗余的)信息,例如引用哪个集合。它具有许多驱动程序库本身支持的优点,因此它使您的生活更容易一些。

最终,哪些方法有效并且相关取决于您正在尝试做什么。考虑选项,权衡并调用它是否应该做的事情。并试验。

答案 1 :(得分:0)

尝试避免重复数据,如果存储大量不需要搜索的数据,可能会使用某种形式的压缩。

答案 2 :(得分:0)

我认为好的方法是使用一个文档来获取相关数据

例如,如果您有用户集合,则可以向每个用户提供文档,并在本文档中植入其他内容,如头像或acl等其他内容