MongoDb и F #: как получить минимальное и максимальное значения поля в коллекции? - PullRequest
0 голосов
/ 14 апреля 2019

Я использую последнюю (на момент написания) версию (2.8) драйвера C # MongoDb. Я использую это от F #. Я хочу получить минимальное и максимальное значения поля.

Похоже, мало что известно о том, как использовать MongoDb (последняя версия) из F #, поэтому я прошу прощения, если что-то пропустил.

Единственное, что я смог собрать, это следующее

        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'.

Кроме того, я весьма удивлен тем, как неловко использовать MongoDb из F #.

Сообщение Закрыть Редактировать:

Этот вопрос о том, как выполнить задачу в F #. Вопрос , связанный с , обслуживает какой-то другой язык (вероятно, оболочку монго). Использование этих методов (насколько я знаю) в F # невозможно.

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Вы можете по крайней мере упростить построение своих словарей, используя функцию dict:

let grpb =
    dict [
        "_id", null
        "min", dict ["$min", "$ReadingDate"]
        "max", dict ["$max", "$ReadingDate"]
    ]
let aggb = new BsonDocument(dict ["$group", grpb])
0 голосов
/ 14 апреля 2019

Я заставил его работать с этим

    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

Но я думаю, что это безобразно.Не проще ли?

...