我似乎无法弄清楚为什么我的查询使用一种形式的索引而不是另一种形式的索引。 我有一个集合,其中包含 DocumentDb 中的一种类型的文档。 TrueInvoiceId 列上有一个索引是单个(非稀疏)索引。数据库非常简单,没有什么复杂或花哨的配置。两种不同形式的查询有两种截然不同的行为方式,我似乎无法弄清楚其中的区别或如何在我的 C# 驱动程序中实现快速版本(使用索引)。
示例文档: { 真实发票 ID:1234, 名称:《预约》 }
运行此查询时:
db.trueinvoicesnapshot.explain("queryPlanner").find({TrueInvoiceId: 22175665});
一切都快如闪电。它使用了索引和所有内容
当我运行这个时:
db.trueinvoicesnapshot.explain("queryPlanner").find({filter: {TrueInvoiceId: 22175665}});
这导致了 COLSCAN
当我尝试提供提示时,我收到以下错误消息: -- 无法对此查询使用提示。索引是多键索引或稀疏索引,并且查询未针对使用此索引进行优化。
我不明白如何过滤会把一切搞砸。我很想把头埋在沙子里,弄清楚如何在 C# 驱动程序中编写可用的驱动程序。
现有的C#代码:
var find = Builders<TrueInvoiceSnapshot>.Filter.Where(x => x.TrueInvoiceId == trueInvoiceId);
return GetCollection().Find(_session, find).ToList();
我很想将索引切换为稀疏索引,看看这是否有效,但我希望有一些更有意义的东西(通过正确的理解,稀疏可能有意义!)
额外细节: 我尝试使用聚合匹配..同样的故事: db.trueinvoicesnapshot.aggregate([{$match: {TrueInvoiceId: 22175676}}], {提示: "TrueInvoiceId_1"}).explain("queryPlanner");
谢谢!
您的两个疑问:
db.trueinvoicesnapshot.explain("queryPlanner").find({TrueInvoiceId: 22175665});
和
db.trueinvoicesnapshot.explain("queryPlanner").find({filter: {TrueInvoiceId: 22175665}});
逻辑上不同。第一个尝试查找
TrueInvoiceId
为 22175665
的文档,因此它使用 TrueInvoiceId
上的索引。
第二个尝试查找键 filter
的值为 {TrueInvoiceId: 22175665}
的文档,并且由于键 filter
上没有索引,因此执行 COLSCAN
。你可以试试这个:
var filter = Builders<TrueInvoiceSnapshot>.Filter.Eq(x => x.TrueInvoiceId, trueInvoiceId);