对MongoDB中查询的怀疑

时间:2018-07-24 20:00:40

标签: c# mongodb

我正在尝试查询以给定名称开头的名称。在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();

1 个答案:

答案 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()