我正在设计我的第一个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有16M字节的文档大小限制。我认为访问非常频繁的文件可能会突破这一限制。
有没有更好的方法来设计这种类型的日志记录的NoSQL模式?
发布于 2012-08-27 20:09:44
让我们首先尝试计算一条日志记录的平均大小:
时间戳字= 18,时间戳值= 8,用户字= 8,用户value=20 (10个字符,我猜是最大值(或者肯定是平均值)),访问字= 12,访问值10。所以总共是76个字节。因此,您可以拥有大约220000的日志记录。
一半的物理空间将由字段名称使用。如果您将timestamp = t,user = u,access=a命名为timestamp=t,user=u,access=a --您将能够存储大约440000的日志项。
所以,我认为这对大多数系统来说已经足够了。在我的项目中,我总是尝试嵌入而不是创建单独的集合,因为这是使用mongodb实现良好性能的一种方式。
将来,您可以将日志记录移动到单独的集合中。此外,为了提高性能,您可以在文件文档中保存30条最后的日志记录(简单地对它们进行非规范化处理),以便在收集日志的同时进行快速检索。
另外,如果你要使用一个集合,请确保在你不需要的时候不加载日志(你可以在mongodb中包含/排除字段)。还可以使用$slice进行分页。
最后一件事:享受mongo!
发布于 2012-08-27 20:00:19
如果您认为文档限制将成为一个问题,那么几乎没有其他选择。
最明显的方法是为每个日志简单地创建一个新文档。
因此,您将拥有一个集合“日志”。使用此模式。
{
"filename": "some_file_name",
"timestamp": "2012-08-27 11:40:45",
"user": "joe",
"access": "read"
}查找"joe“读取了哪些文件的查询将类似于
db.logs.find({user: "joe", access: "read"})https://stackoverflow.com/questions/12141284
复制相似问题