2

我正在为日志管理系统设计我的第一个 MongoDB 数据库模式,我想将日志文件中的信息存储到 mongoDB,但我无法决定应该为大型文档(嵌入式与参考)使用哪种模式。

注意:项目有很多来源,来源有很多日志(在某些情况下超过 1 000 000 条日志)

  {    
      "_id" : ObjectId("5141e051e2f56cbb680b77f9"),   
      "name" : "projectName",
      "source" : [{
          "name" : "sourceName",
          "log" : [{
              "time" : ISODate("2012-07-20T13:15:37Z"),
              "host" : "127.0.0.1",
              "status" : 200.0,
              "level" : "INFO",
              "message" : "test"
            }, {
              "time" : ISODate("2012-07-20T13:15:37Z"),
              "host" : "127.0.0.1",
              "status" : 200.0,
              "level" : "ERROR",
              "message" : "test"
            }]
        }]
    }

我的重点是从数据库(非写入)读取数据期间的性能,例如过滤、搜索、分页等。用户可以按日期、状态等过滤源日志(所以我想在用户搜索或过滤数据时关注读取性能)

我知道 MongoDB 有 16Mbyte 的文档大小限制,所以我担心我是否会有 1 000 000 条日志用于一个源,这将如何工作(因为我可以为一个项目提供多个源,而源可以有多个日志)。当我要处理大型文档并且想要获得良好的阅读性能时,有什么更好的解决方案,我应该使用嵌入式模式还是参考模式?谢谢

4

2 回答 2

3

你的问题的答案都不是。您应该将架构扁平化为每个日志条目一个文档,而不是嵌入或使用引用,以便它可以扩展到超出 16MB 文档限制的任何内容,并且您可以访问 MongoDB 查询功能的全部功能和性能。

因此,摆脱数组字段并使用以下方法将所有内容移至顶级字段:

{    
    "_id" : ObjectId("5141e051e2f56cbb680b77f9"),   
    "name" : "projectName",
    "sourcename" : "sourceName",
    "time" : ISODate("2012-07-20T13:15:37Z"),
    "host" : "127.0.0.1",
    "status" : 200.0,
    "level" : "INFO",
    "message" : "test"
  }, {
    "_id" : ObjectId("5141e051e2f56cbb680b77fa"),   
    "name" : "projectName",
    "sourcename" : "sourceName",
    "time" : ISODate("2012-07-20T13:15:37Z"),
    "host" : "127.0.0.1",
    "status" : 200.0,
    "level" : "ERROR",
    "message" : "test"
}
于 2013-03-14T15:34:26.750 回答
1

我认为在数组中包含日志可能会变得混乱..如果项目和源实体除了名称之外没有任何属性(键)并且日志不会长时间存储,您可以使用每个有一个日志的封顶集合文档:

{_id: ObjectId("5141e051e2f56cbb680b77f9"), p: "project_name", s: "source_name", "time" : ISODate("2012-07-20T13:15:37Z"), "host" : "127.0.0.1", "status" : 200.0, "level" : "INFO", "message" : "test"}

也请参考:http ://docs.mongodb.org/manual/use-cases/storing-log-data/

封顶收藏品保持自然秩序。因此,您不需要时间戳索引即可按自然顺序返回日志。在您的情况下,您可能希望从特定源/项目中检索所有日志。您可以创建索引{p:1,s:1}来加速此查询。

但我建议你做一些“基准测试”来检查性能。试试上面的封顶收集方法。还可以尝试使用您建议的完全嵌入式架构对文档进行分桶。这种技术用于经典的博客评论问题。因此,您只需将每个源的这么多日志存储在单个文档中,并在超过自定义大小时溢出到新文档。

于 2013-03-14T16:12:48.370 回答