使用Filter.Where时使用MongoDB C#驱动程序的性能

时间:2016-10-26 14:31:52

标签: c# mongodb performance

假设您有以下代码行:

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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()));

并收到运行时错误。与正则表达式匹配类似

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

不足为奇,但很高兴知道。