我正在开发日志管理系统,用户将能够从文件上传日志。我有“事件”集合,我存储来自所有源的所有事件(每个源可以有不同的日志格式,在一个集合中我可以有例如 10 000 000 条记录 - 'source1' 有 5 000 000 条,'source2' 有 5 000 000 条)。我想为用户提供过滤选项(过滤选项将仅适用于源,因此用户可以按级别、数据等过滤数据)并且为了获得更好的性能,我想创建索引和复合索引。在用户将日志上传到系统之前,他/她将决定在过滤期间要使用哪些过滤器查询。所以我可以有不同的查询。问题是我可以在一个集合中有许多不同的源,这意味着许多不同的过滤器查询,但 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"
}