mongodb AggregateAsync最適化の考え方
mongodb取得データはAggregateAsyncでBsonDocumentでしか取得できませんがデータが多いとresult.ToList()ここでは特に遅いですが、最適化の方法を考えてクエリーの結果をredisに記録します.クエリー時間が保存時間より大きい場合は、この時間差の内容を再綴り込みます.保存時間より小さい場合は、直接結果を取り出して変換する速度がずっと速いです.
var stages = new List(); stages.Add(new JsonPipelineStageDefinition("{KaTeX parse error: Can't use function '\"' in math mode at position 8: unwind:\̲"̲Logs"}")); stages.Add(new JsonPipelineStageDefinition("{KaTeX parse error: Can't use function '\"' in math mode at position 8: match:{\̲"̲Logs.time\":{gte:’"+ stime.ToString(“yyyy-MM-dd HH:mm:ss”) + "’,KaTeX parse error: Expected 'EOF', got '}' at position 52: …HH:mm:ss") + "'}̲}}")); …replaceRoot:{newRoot: “KaTeX parse error: Can't use function '\"' in math mode at position 5: Logs\̲"̲}}")); …project:{ “host”:1,“request_uri”:1,“body_bytes_sent”:1,“client_ip”:1,“http_referer”:1,“request_time”:1,“time”:1,“vip_addr”:1,“request_method”:1,“request_length”:1,“upstream_status”:1}}”)); var pipeline = new PipelineStagePipelineDefinition(stages); var result = await Collection1.AggregateAsync(pipeline);
var stages = new List(); stages.Add(new JsonPipelineStageDefinition("{KaTeX parse error: Can't use function '\"' in math mode at position 8: unwind:\̲"̲Logs"}")); stages.Add(new JsonPipelineStageDefinition("{KaTeX parse error: Can't use function '\"' in math mode at position 8: match:{\̲"̲Logs.time\":{gte:’"+ stime.ToString(“yyyy-MM-dd HH:mm:ss”) + "’,KaTeX parse error: Expected 'EOF', got '}' at position 52: …HH:mm:ss") + "'}̲}}")); …replaceRoot:{newRoot: “KaTeX parse error: Can't use function '\"' in math mode at position 5: Logs\̲"̲}}")); …project:{ “host”:1,“request_uri”:1,“body_bytes_sent”:1,“client_ip”:1,“http_referer”:1,“request_time”:1,“time”:1,“vip_addr”:1,“request_method”:1,“request_length”:1,“upstream_status”:1}}”)); var pipeline = new PipelineStagePipelineDefinition(stages); var result = await Collection1.AggregateAsync(pipeline);
var loglist = new List();
foreach (var item in result.ToList())
{
loglist.Add(new LogListInfo()
{
Body_bytes_sent = long.Parse(item.Values.ToArray()[0].ToString()),
Client_ip = item.Values.ToArray()[1].ToString(),
Host = item.Values.ToArray()[2].ToString(),
Http_referer = item.Values.ToArray()[3].ToString(),
Request_length = item.Values.ToArray()[4].ToString().Contains("|") ? 0 : long.Parse(item.Values.ToArray()[4].ToString()),
Request_method = item.Values.ToArray()[5].ToString(),
Request_time = float.Parse(item.Values.ToArray()[6].ToString()),
Request_uri = item.Values.ToArray()[7].ToString(),
Status = item.Values.ToArray()[9].ToString() == "-" ? 0 : int.Parse(item.Values.ToArray()[9].ToString()),
Time = DateTimeToUnixTimestamp(Convert.ToDateTime(item.Values.ToArray()[8].ToString())),
CountTime = Convert.ToDateTime(item.Values.ToArray()[8].ToString()).ToString("MM-dd HH:mm"),
Vip_addr = item.Values.ToArray()[10].ToString()
});
}