mongodb AggregateAsync 一种优化思路

当使用MongoDB的AggregateAsync获取大量数据时,通过BsonDocument加载结果到内存会非常慢。为了解决这个问题,可以将查询结果缓存到Redis中,并记录保存时间。如果查询时间超过保存时间,只补充时间差内的数据;若在保存时间内,直接从Redis读取,显著提高效率。应用这一策略,通过构建并执行复杂的聚合管道(包括$unwind、$match和$project等操作),实现了性能优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mongodb 获取数据 用AggregateAsync 只能用BsonDocument来获取结果
但是数据很多的话 result.ToList() 这里就会特别慢
后来想到优化的方法
把查询的结果放进redis 记录一个保存时间 如果查询时间大于保存时间 把这个时间差的内容 再拼接进去 如果小于保存时间 直接取出结果 去转化 速度快很多

var stages = new List();
stages.Add(new JsonPipelineStageDefinition<BsonDocument, BsonDocument>("{KaTeX parse error: Can't use function '\"' in math mode at position 8: unwind:\̲"̲Logs"}"));
stages.Add(new JsonPipelineStageDefinition<BsonDocument, BsonDocument>("{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<BsonDocument, BsonDocument>(stages);
var result = await Collection1.AggregateAsync(pipeline);

        var loglist = new List<LogListInfo>();

        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()
            });
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值