节省mongodb空间的技巧

Mar*_*ark 9 diskspace mongodb

各种mongodb服务米由磁盘使用.使用mongodb时有哪些节省空间的技巧?

谢谢.

Mar*_*ing 11

这个问题真的很模糊.某些可能适用于您的内容(不按特定顺序排列):

缩短详细的字段名称

最好用一个例子来说明:

{
    surname: "Smith",
    forename: "John",
    location: { grid_e: 100.02, grid_n: 450.08 }
}
Run Code Online (Sandbox Code Playgroud)

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

{
    sn: "Smith",
    fn: "John",
    loc: { e: 100.02, n: 450.08 }
}
Run Code Online (Sandbox Code Playgroud)

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

上限收藏

通过上限集合,您可以指定要存储的文档数量的限制.它以先进先出的方式工作(最旧的文档将被丢弃).如果您正在记录并希望存储最新的x文档,则这尤其适用,但旧的文档没有相关性.

使用上限集合有一些注意事项.有关完整详细信息,请参阅MongoDB文档.

考虑一下你的文件的关系

文档可以具有嵌入文档或与其他文档(在其他集合中)外键样式的关系.我们经常讨论 每种方法的优缺点,但最终您可以选择适合您的方法.

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

编辑:扩展关系

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

{
    _id: <whatever>,
    title: "Document Relationships in MongoDB",
    body: "bla bla bla bla",
    // ...
    user_id: <id of the user document>
}
Run Code Online (Sandbox Code Playgroud)

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

{
    _id: <whatever>,
    name: "Mark Embling",
    email: "example@markembling.info",
    ///...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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