1

我正在设计我的第一个 MongoDB(和第一个 NoSQL)数据库,并希望将有关文件的信息存储在一个集合中。作为每个文件文档的一部分,我想存储文件访问(读取和写入)的日志。

我正在考虑创建一个日志消息数组作为文档的一部分:

{
    "filename": "some_file_name",
    "logs" : [
        { "timestamp": "2012-08-27 11:40:45", "user": "joe", "access": "read" },
        { "timestamp": "2012-08-27 11:41:01", "user": "mary", "access": "write" },
        { "timestamp": "2012-08-27 11:43:23", "user": "joe", "access": "read" }
    ]
}

每条日志消息将包含时间戳、访问类型和访问文件的人的用户名。我认为这将允许非常快速地访问特定文件的日志,这可能是对日志执行的最常见操作。

我知道 MongoDB 有 16Mbyte 的文档大小限制。我想经常访问的文件可能会突破这个限制。

有没有更好的方法来为这种类型的日志设计 NoSQL 模式?

4

2 回答 2

2

如果您认为文件限制将成为一个问题,则几乎没有其他选择。

显而易见的一个是为每个日志简单地创建一个新文档。

所以你会有一个收集“日志”。有了这个架构。

{
    "filename": "some_file_name",
    "timestamp": "2012-08-27 11:40:45", 
    "user": "joe", 
    "access": "read"
}

查找“joe”读取的文件的查询将类似于

db.logs.find({user: "joe", access: "read"})
于 2012-08-27T12:00:18.577 回答
2

让我们首先尝试计算一条日志记录的平均大小:

时间戳字 = 18,时间戳值 = 8,用户字 = 8,用户值 = 20(我猜是 10 个字符(或肯定是平均值)),访问字 = 12,访问值 10。所以总共是 76 个字节。因此,您可以拥有约 220000 条日志记录。

字段名称将使用一半的物理空间。如果您将命名 timestamp = t, user = u, access=a - 您将能够存储约 440000 个日志项。

所以,我认为这对于大多数系统来说已经足够了。在我的项目中,我总是尝试嵌入而不是创建单独的集合,因为它是使用 mongodb 实现良好性能的一种方式。

将来,您可以将日志记录移动到单独的集合中。此外,为了提高性能,您可以在文件文档中拥有 30 条最后的日志记录(简单地对其进行非规范化),以便在日志收集之外进行快速检索。

此外,如果您将使用一个集合,请确保在不需要它们时不加载日志(您可以在 mongodb 中包含/排除字段)。也$slice用来做分页。

最后一件事:享受 mongo!

于 2012-08-27T12:09:44.377 回答