我正在使用C#MongoDb驱动程序的最新版本(在撰写本文时)(2.8)。我正在使用F#。我想获取一个字段的最小值和最大值。
关于如何使用F#的MongoDb(最新版本)似乎没有很多,因此,如果我错过了什么,我深表歉意。
我唯一可以构建的是以下
let client = new MongoClient(connString)
let db = client.GetDatabase("AirQuality")
let col = db.GetCollection<ReadingValue>("ReadingValue")
let toDictionary (map : Map<_, _>) : Dictionary<_, _> = Dictionary(map)
let minb = ["$min", "$ReadingDate"] |> Map.ofList |> toDictionary
let maxb = ["$max", "$ReadingDate"] |> Map.ofList |> toDictionary
let grpb =
[
"_id", null
"min", minb
"max", maxb
] |> Map.ofList |> toDictionary
let aggb = ["$group", grpb] |> Map.ofList |> toDictionary
let doc = new BsonDocument(aggb)
let pl = new BsonDocumentPipelineStageDefinition<ReadingValue,string>(doc)
let epl = new EmptyPipelineDefinition<ReadingValue>()
let finalPipeline = epl.AppendStage(pl)
use result = col.Aggregate(finalPipeline)
但是它会引发运行时错误Cannot deserialize a 'String' from BsonType 'Document'.
顺便说一句,我很惊讶使用F#中的MongoDb是多么尴尬。
帖子关闭编辑:
这个问题是关于如何在F#中完成任务的。问题linked to迎合了其他一些语言(可能是mongo shell)。 (据我所知)在F#中无法使用这些技术。
答案 0 :(得分:1)
您至少可以使用dict
函数来简化字典的构造:
let grpb =
dict [
"_id", null
"min", dict ["$min", "$ReadingDate"]
"max", dict ["$max", "$ReadingDate"]
]
let aggb = new BsonDocument(dict ["$group", grpb])
答案 1 :(得分:0)
我理解了这一点
type MinMax = {_id:obj; min:string; max:string}
let client = new MongoClient(connString)
let db = client.GetDatabase("AirQuality")
let col = db.GetCollection<ReadingValue>("ReadingValue")
let toDictionary (map : Map<_, _>) : Dictionary<_, _> = Dictionary(map)
let minb = ["$min", "$ReadingDate"] |> Map.ofList |> toDictionary
let maxb = ["$max", "$ReadingDate"] |> Map.ofList |> toDictionary
let grpb =
[
"_id", null
"min", minb
"max", maxb
] |> Map.ofList |> toDictionary
let aggb = ["$group", grpb] |> Map.ofList |> toDictionary |> (fun x -> new BsonDocument(x))
let pl = new BsonDocumentPipelineStageDefinition<ReadingValue,MinMax>(aggb)
let epl = new EmptyPipelineDefinition<ReadingValue>()
let finalPipeline = epl.AppendStage(pl)
use result = col.Aggregate(finalPipeline)
let minMax = result.ToList() |> Seq.head
但是我认为这很丑。有没有更简单的方法?