我正在研究日志管理系统,用户可以从文件上传日志。我有'事件'集合,我存储来自所有来源的所有事件(每个来源可以有不同的日志格式,在一个集合中我可以有例如10 000 000条记录 - 5 000 000用于'source1'和5 000 000用于'source2' )。我想为用户提供过滤器选项(过滤器选项仅适用于源,因此用户可以按级别,数据等过滤数据),为了获得更好的性能,我想创建索引和复合索引。在用户将日志上载到系统之前,他/她将决定在过滤期间要使用哪些过滤器查询。所以我可以有不同的疑问。问题是我可以在一个集合中有许多不同的源,这意味着许多不同的过滤器查询,但mongoDB每个集合只允许64个索引。
那么,如果我想要具有良好的读取性能并且我希望让用户过滤日志(用户将决定在将日志上传到系统之前过滤数据的方式),那么最佳解决方案是什么?我正在考虑为每个源创建新的集合,因为每个集合永远不会达到64个索引。
查询示例:
db.events.ensureIndex({"source_id": 1, "timestamp" : 1})
db.events.ensureIndex({"source_id": 1, "timestamp" : 1, "level": 1})
db.events.ensureIndex({"source_id": 1, "diagnostic_context": 1})
db.events.ensureIndex({"source_id": 1, "timestamp" : 1, "statusCode": 1})
db.events.ensureIndex({"source_id": 1, "host" : 1})
事件收集样本:
{ _id: ObjectId("507f1f77bcf86cd799439011"),
timestamp: ISODate("2012-09-27T03:42:10Z"),
thread: "[http-8080-3]",
level: "INFO",
diagnostic_context: "User 99999",
message: "existing customer saving"},
source_id: "source1"
{ _id: ObjectId("507f1f77bcf86cd799439012"),
host: "144.18.39.44",
timestamp: ISODate("2012-09-01T03:42:10Z"),
request: "GET /resources.html HTTP/1.1",
statusCode: 200
bytes_sent: 3458,
url: "http://www.aivosto.com/",
agent: "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
source_id: "source2"
}