MongoDB和有效地返回集合

时间:2019-01-06 05:12:20

标签: c# mongodb

我对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()的位置不当会导致性能严重下降。抱歉,如果这不是问的地方。

参考: https://docs.mongodb.com/guides/server/read_queries/

1 个答案:

答案 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查询无法翻译,则会出现运行时异常,并且错误消息会指出不支持查询的哪一部分。