我有一个包含1.5M记录的集合。当我使用mongoshell查询集合时,它会在2.0中返回数据,当我使用Mongo驱动程序C#执行相同操作时,需要13-16秒才能返回列表。我也在集合上实现了索引。
MongoShell查询:
db.DiscountTMV.distinct("OriginId" ,{ $and : [
{"LTLRates.CustomerId" : ObjectId("5faac93be2867c2748bcd6a7")},
{"LTLRates.TenId" : ObjectId("5faac63be2867c2748ae95a8")},
{"OriginId" : {$in :[ ObjectId("5faac922e2867c2748bcb745"),ObjectId("5faac922e2867c2748bcb73d"),ObjectId("5faac922e2867c2748bcb73f"),ObjectId("5faac922e2867c2748bcb741"),ObjectId("5faac922e2867c2748bcb71c"),ObjectId("5faac922e2867c2748bcb749"),
]}}
]})
OriId的In运算符有时包含200多个ID,这些ID基于用户输入的条件。
C#代码:
var ratingFilter = Builders<DiscountTMV>.Filter.ElemMatch(x => x.LTLRates, x => x.TenId == tenId);
ratingFilter &= Builders<DiscountTMV>.Filter.ElemMatch(x => x.LTLRates, x => x.CustomerId == customerId);
ratingFilter &= Builders<DiscountTMV>.Filter.In("OriginId", filteredRegionIds);
var discountTiers = await _mContext.DiscountTMV.Distinct<string>("OriginId", ratingFilter).ToListAsync();
我尝试的另一个查询是:
var ratingFilter = Builders<DiscountTMV>.Filter.Eq("LTLRates.TenId" == tenId);
ratingFilter &= Builders<DiscountTMV>.Filter.Eq("LTLRates.CustomerId" == customerId);
ratingFilter &= Builders<DiscountTMV>.Filter.In("OriginId", filteredRegionIds);
var discountTiers = await _mContext.DiscountTMV.Distinct<string>("OriginId", ratingFilter).ToListAsync();
任何人都知道如何使用C#Mongo驱动程序或任何建议来实现相同的输出性能。如果有人共享相同查询的正确语法以在MongoDb C#驱动程序的RunCommand dAsync方法中运行,那就太好了。事先感谢。
下面是MongoDB查询统计数据的图像。
在此处输入图像描述
从不同环境查询时,查询执行时间的差异是由于:
要进行故障排除,请验证:
如果您已经完成了上述所有操作,并且仍然看到不同的执行时间,请使用收集到的信息更新问题,以证明上述所有内容都匹配。