假设您有以下代码行:
var filter = Builders<BsonDocument>.Filter.Where(t => t.id == myId);
var result = collection.Find(filter).ToList();
过滤器构建器是否将lambda转换为文字$ where子句,还是优化它以使用$ eq子句? $ where的性能很慢,所以如果没有翻译,我不想使用它。
这是一个简单的示例,但我们的代码中有其他查询更长,但很容易转换为非$ where查询。
答案 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()));
不足为奇,但很高兴知道。