提问者:小点点

使用MongoDB Driver for C#的不同查询比通过MongoDB shell发送的相同查询慢得多


我有一个包含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查询统计数据的图像。

在此处输入图像描述


共1个答案

匿名用户

从不同环境查询时,查询执行时间的差异是由于:

  • 正在执行不同的查询。使用命令监控来获取驱动程序发送的实际查询。
  • 查询实际上并未由其中一个环境执行。一些查询方法是惰性的,在迭代结果之前不会真正发出查询。
  • 请求的结果数量不同(第一批与所有结果)。
  • 在两种环境中,不同的数据类型需要不同的时间来序列化/反序列化到/从BSON。

要进行故障排除,请验证:

  • 在这两种情况下,查询都被实际执行。
  • 正在发送相同的查询。
  • 从结果集中检索相同数量的文档(例如所有文档)。
  • 查询和结果中的数据类型尽可能简单(尝试整数或短字符串)。

如果您已经完成了上述所有操作,并且仍然看到不同的执行时间,请使用收集到的信息更新问题,以证明上述所有内容都匹配。