使用Filter时的性能.其中使用MongoDB c#驱动程序

本文关键字:MongoDB 驱动程序 Filter 性能 使用 | 更新日期: 2023-09-27 18:14:57

假设您有以下代码行:

var filter = Builders<BsonDocument>.Filter.Where(t => t.id == myId);
var result = collection.Find(filter).ToList();

过滤器构建器将lambda转换为文字$where子句还是将其优化为使用$eq子句?$where的性能很慢,所以如果没有翻译,我不想使用它。

这是一个简单的例子,但在我们的代码中有其他更长的查询,但很容易转换为非$where查询。

使用Filter时的性能.其中使用MongoDB c#驱动程序

感谢David Osborne上面的评论,我能够做更多的研究并得出一个答案。事实证明,简单的LINQ查询实际上可以直接转换为本机Mongo查询,而不是转换为$where查询。

var filter = Builders<BsonDocument>.Filter.Where(x => x["status"] != "ready");
var findFluent = collection.Find(filter);
Console.WriteLine(findFluent);
filter = Builders<BsonDocument>.Filter.Ne("status", "ready");
var findFluent = collection.Find(filter);
Console.WriteLine(findFluent);

都输出相同的查询。这适用于等式和逻辑运算符的简单组合。

然而,有些操作符似乎无法通过LINQ访问。我试图写一个$in查询

var success = new List<string> { "imported", "processed" };
var filter = Builders<BsonDocument>.Filter.Where(x => success.Contains(x["status"].ToString()));

并得到一个运行时错误。类似地使用regex match

var regex = new Regex("^*0000");
var filter = Builders<BsonDocument>.Filter.Where(x => regex.IsMatch(x["orderId"].ToString()));