mongodb - 如何在 F# 中使用字符串动态指定字段 MongoDB 定义
问题描述
我开始使用强类型定义
let coll: IMongoCollection<NZPostDataItem> = MongoUtil.getNzpostCollection()
let filter = Builders<NZPostDataItem>.Filter.And(
Builders<NZPostDataItem>.Filter.Gte((fun n -> n.dateLodged),DateTime(2020,10,1)),
Builders<NZPostDataItem>.Filter.Eq((fun n -> n.eshipMatched.Value) , true)
)// ... etc
问题是,我需要动态运行查询,因为其中一个对象包含 BSONDocument
let coll: IMongoCollection<NZPostDataItem> = MongoUtil.getNzpostCollection()
let t = Nullable<bool> true
let filter =
FilterDefinition<BsonDocument>.op_Implicit(
"{
eshipMatched:true,
'eship.order.carrier_service_code':'TDEAUS',
dateLodged: {$gte: new Date('01-Oct-2020')}}
)"
)
直接在 MongoDB 上工作。但是当我尝试查询它时,我得到一个编译时错误。
let results = coll.Find(filter).Limit(10000).ToList<NZPostDataItem>()
严重性代码 描述 项目文件行抑制状态错误 FS0041 方法“查找”没有重载匹配。
已知参数类型:FilterDefinition
Available overloads:
- (extension) IMongoCollection.Find<'TDocument>(filter: FilterDefinition<'TDocument>,?options:
FindOptions) : IFindFluent<'TDocument,'TDocument> // Argument 'filter' doesn't match
- (extension) IMongoCollection.Find<'TDocument>(filter:
Linq.Expressions.Expression<Func<'TDocument,bool>>,?options: FindOptions) :
IFindFluent<'TDocument,'TDocument> // Argument 'filter' doesn't match
所以 - 我可以看到有什么问题 - 可能有两种类型的定义 - 但我需要动态过滤但返回一个强类型对象。
解决方案
正如您所说,您希望过滤器既是动态的又是强类型的,所以这就是您应该创建的:
let filter =
FilterDefinition<NZPostDataItem>.op_Implicit("{ ... }")
推荐阅读
- amazon-web-services - 尝试在 aws cloudformation CLI 中提示参数字段时出现问题
- download - youtube-dl 如何获取字幕文件名?
- macos - macOS High Sierra - 为什么使用 Firefox 或 Safari 只能找到或浏览此 SVG 中的某些字符(使用 CTRL+F 搜索)?
- python - Django - 检查一个非外键整数字段是否作为另一个模型的主键存在?
- java - 如何将通过 TCP 发送数据的数据从 C++ 转换为 Java
- regex - 在 Sub 中调用 Myrange 函数
- excel - 确定 Sheet1 的 A 列中的任何值是否与 Sheet2 的每一行中的任何值匹配
- python - 计算二叉搜索树中只有一个孩子的节点?
- sql - SQL 多格式日期
- amazon-web-services - 我们如何在 docker 上运行 Neptune 图形数据库