BsonDocument赋值FilterDefinition<TDocument>:Find方法为何接受BsonDocument?
为什么IMongoCollection.Find()可以接受BsonDocument作为参数?
你找不到直接接收BsonDocument的Find重载,是因为IMongoCollection<T>.Find()的核心参数类型是FilterDefinition<T>,而非BsonDocument——但MongoDB .NET驱动通过隐式类型转换,让BsonDocument能自动适配这个参数。
具体细节:
FilterDefinition<T>是驱动封装查询条件的抽象类型,它支持多种实现,其中就包括基于原生BsonDocument的BsonDocumentFilterDefinition<T>。- 驱动在
FilterDefinition<T>类中定义了从BsonDocument到FilterDefinition<T>的隐式转换运算符,核心逻辑类似:
public static implicit operator FilterDefinition<TDocument>(BsonDocument document) { return new BsonDocumentFilterDefinition<TDocument>(document); }
- 当你把
new BsonDocument()传入Find()时,编译器会自动触发这个转换,将BsonDocument转成对应的FilterDefinition实例,因此代码能正常编译运行。
这种设计是为了兼顾灵活性:你既可以用强类型的Lambda表达式(比如Builders<Foo>.Filter.Empty)构建查询,也可以直接用原生BsonDocument编写条件,适配不同开发场景和习惯。你代码里的new BsonDocument()等价于空过滤器,会返回集合内所有文档。
内容的提问来源于stack exchange,提问作者Noctis Tong
相关产品推荐
相关产品推荐

