我对Mongo(这实际上是第一天)很陌生,并且正在使用可用的C#驱动程序。我想知道的一件事(因为我不确定如何在Google中用词表达)是当我想获取集合的一部分时mongo如何处理正在执行的查询。
我的意思是,我知道使用NHibernate和EF Core,将首先构建查询,并且只有在强制转换时才会触发查询。所以说像IQueryable到IEnnumerable,.ToList()等。
例如:
//Query is fired when I call .ToList, until that point it is just building it
context.GetLinqQuery<MyObject>().Where(x => x.a == 'blah').ToList();
但是,对于Mongo的示例,在我看来,如果我想获取过滤结果,则首先需要获取集合,然后将其过滤掉。
例如:
var collection = _database.GetCollection<MyObject>("MyObject");
//Empty filter for ease of typing for example purposes
var filter = Builders<MyObject>.Filter.Empty;
var collection.Find(filter).ToList();
如果我在这里缺少任何内容,我认为我没有在GetCollection方法中看到任何可以接受过滤器的重载。这是否意味着它将首先将整个集合加载到内存中,然后对其进行过滤?还是它仍在构建查询并仅在我对它调用.Find或.ToList之后执行它?
我之所以这样问,是因为在工作中,.ToList()的位置不当会导致性能严重下降。抱歉,如果这不是问的地方。
答案 0 :(得分:2)
与您的context.GetLinqQuery<MyObject>()
等效的是使用AsQueryable
:
collection.AsQueryable().Where(x => x.a == "blah").ToList();
上面的查询将在服务器端执行 * ,等效于:
collection.Find(Builders<MyObject>.Filter.Eq(x => x.a, "blah")).ToEnumerable().ToList();
* The docs指出:
仅支持可转换为等效MongoDB查询的LINQ查询。如果您编写的LINQ查询无法翻译,则会出现运行时异常,并且错误消息会指出不支持查询的哪一部分。