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

Posted

技术标签:

【中文标题】使用 MongoDB Driver for C# 的不同查询比通过 MongoDB shell 发送的相同查询慢得多【英文标题】:Distinct query using MongoDB Driver for C# is much slower than the same query sent via MongoDB shell 【发布时间】:2021-05-04 22:25:05 【问题描述】:

我有一个包含 150 万条记录的集合。当我使用 mongo shell 查询集合时,它会在 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"),
    ]
])

OriginId 的 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# 驱动程序的 RunCommandAsync 方法中运行,那也很棒。提前致谢。

下图是 MongoDB 查询的统计数据。

enter image description here

【问题讨论】:

获取您通过 C# 发送的查询,与使用 shell 的查询进行比较。 两个查询是一样的。 在这种情况下,如果您怀疑 C# 比应有的速度慢,请使用性能分析器。获取一些实际指标。如果差异如此之大,您会很快看到这段时间都花在了哪里。 不要添加链接,除非它们指向引用的文档。将图像内嵌。 【参考方案1】:

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

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

要进行故障排除,请确认:

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

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

【讨论】:

以上是关于使用 MongoDB Driver for C# 的不同查询比通过 MongoDB shell 发送的相同查询慢得多的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB for C#基础入门

MongoDB C# Driver 快速入门

MongoDb c# driver 2.0 查询样式

使用 C# Driver 2.1.1 存储在 MongoDb 集合中的对象的最大大小是多少?

mongodb driver c#语法

C# 操作mongodb 分组