c# - MongoDb驱动c#查询优化
问题描述
我在 mongo db doc 中读到了我也可以使用 LINQ,但我对此一无所知。
例如,如果我写:
var result = collection.Find(filter);
和
var result = collection.AsQueryable()
.Where(x => x.Foo == 114)
什么是更好的?
基于整个集合的LINQ过滤器?在我获得整个收藏然后过滤之前?或者在过滤器之前,它给了我已经过滤的集合?
解决方案
两者的作用几乎相同。
LINQ API 是 Collection API 的包装器。
通过简要研究mongo-csharp-driver的来源,我可以看到 LINQ 版本调用Collection.FindAs(...)或Collection.Distinct(...)。它基于 LINQ 表达式构造IMongoQuery
传入的参数。query
为此,它使用查询构建器 API(Query类),例如Query.EQ
什么是更好的?
这取决于。
- 如果您在 C# 代码中具有表示数据库中文档结构的类型,那么您可能会从 LINQ API 中受益。您将受益于强类型、更好的可读性,并且您不会错过名称作为字符串传递的重命名标识符。
- 如果你有动态的数据结构,在代码中没有具体的表示(你有某种关于文档的元数据,但没有
class
明确包含文档属性)。在这种情况下,使用 LINQ 会很困难,而原始的 Collection API 会是更好的选择。
基于整个集合的LINQ过滤器?在我获得整个收藏然后过滤之前?或者在过滤器之前,它给了我已经过滤的集合?
由于 LINQ APIIQueryable
不仅实现了IEnumeable
,因此实际上并未调用所有可枚举方法(例如Where
or OrderBy
),而是在编译期间将其转换为构建表达式树的代码。在运行时,构建表达式树并将其传递给底层查询提供程序(在本例中由 MongoDB 驱动程序实现)。查询提供程序将表达式树转换为常规 MongoDB 查询,并通过常规 MongoDB API 执行它们。
有关更多详细信息,请参见如何:使用表达式树构建动态查询。
所以查询实际上是在数据库中执行的,只有经过处理(过滤、排序或投影)的结果才会返回给应用程序。
然而,使用 LINQ API 意味着一些性能开销,因为除了运行查询之外,LINQ API 还:
- 构建表达式树以将它们传递给查询提供程序
- 访问表达式树以将它们转换为本地查询
在许多情况下,这种开销可以忽略不计,但这取决于您的要求。
推荐阅读
- android - 当我使用 firebase 中的哈希映射更新我的值时,我当前的活动崩溃了
- php - Fuel\Core\PhpErrorException [警告]:array_key_exists():第一个参数应该是字符串或整数
- python - 有没有办法限制 Ray 对象存储的最大内存使用量
- angularjs - 保护 Angular JS 表达式
- php - 使用laravel中的长度感知分页器搜索结果分页太慢
- html - 为没有属性的标签创建嵌套的相对 xpath
- angular - 如何在动态插入图像源的角度 2 中使用 onload 事件
- angular - angular-material:如何控制活动高亮颜色条的位置
- android - 我禁用了电话呼叫者视图的全屏,但如何禁用此视图?
- postgresql - 如何在 Windows 上无头(无终端)启动 postgres 服务器?