我正在尝试查询以给定名称开头的名称。在MongoBooster中,我可以使用:
find({Name: { $regex:"^FIRST MIDDLE LAST"}})
只花了一秒钟,但是在C#中我一直在使用LINQ进行查询。我尝试了以下LINQ:
myCollection.AsQueryable<User>().Where(e => e.Name.StartsWith(_input.name) )
但是花了这么长时间(超过一分钟),我才强行终止了手术。
此外,我想知道哪种方法更适合C#, AsQueryable 或 Find ?
答案,这是尼尔(Neil)的答案,很有效,我做了一点修改,以免它是“ var”。
FilterDefinition<User> query = new FilterDefinitionBuilder<User>().Regex(x => x.Name , new BsonRegularExpression("^" + _input.name));
List<User> users = myCollection.Find<User>(query).ToList();
答案 0 :(得分:3)
MongoDB AsQueryable
引擎可能无法将表达式树转换为适当的mongodb过滤器。您应该使用原始过滤器定义来获得更好的结果。这些在c#中相当冗长,但是如果您对javascript api感到满意,应该仍然易于理解。
var builder = new FilterDefinitionBuilder<BsonDocument>()
.Regex(x => x["Name"], new BsonRegularExpression("^FIRST MIDDLE LAST"));
var results = myCollection.Find(builder);
编辑:Official MongoDB Documentation on C# Linq with AsQueryable()
这实际上表示驱动程序支持StartsWith()
。如果.Find()
的运行速度明显快于.AsQueryable().Where()
,则可能导致linq查询在内存中求值,而不是转换为mongo查询。您是否可能使用System.Linq IEnumerable<>.Where()
而不是MongoDB.Driver.Linq IQueryable<>.Where()
?