MongoDb和F#:如何获取集合中某个字段的最小值和最大值?

时间:2019-04-14 07:58:28

标签: mongodb f# mongodb-.net-driver

我正在使用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#中无法使用这些技术。

2 个答案:

答案 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

但是我认为这很丑。有没有更简单的方法?