来自F#中的MongoDb Find的投影结果 [英] Projecting results from MongoDb Find in F#

查看:56
本文介绍了来自F#中的MongoDb Find的投影结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 MongoDB.Driver 查询MongoDB并返回部分查询使用mongo投影的结果.

I'm trying to query MongoDB using MongoDB.Driver and return a partial result using mongo projection.

我已经弄清楚了如何在没有投影的情况下进行查询,但不会得到部分结果.这是我寻找结果的功能:

I've figured out how to query without projection, but not a partial result. This is my function for finding results:

let Find<'a> collectionName (filterDefinition: FilterDefinition<'a>) =
    let collection = database.GetCollection<'a> collectionName
    collection.Find(filterDefinition).ToEnumerable() |> List.ofSeq

这是我如何称呼它的一个例子:

This is an example of how I call it:

let findByIdFilter id =
    Builders<MyModel>.Filter.Eq((fun s -> s.id), id)

let results = Find collectionName (findByIdFilter id)

假设我的模型是这样的:

Let's say my model is something like that:

type MyInnerModel = {
    zInner: bool
}

type MyModel = {
    id: ObjectId
    x: int
    y: double
    z: MyInnerModel
}

这些是我的预测:

type MyModelProjection1 = {
    id: ObjectId
    y: double
}

type MyModelProjection1 = {
    id: ObjectId
    x: int
    z: MyInnerModel
}

如何针对以下情况构建查询:

How do I construct my queries for following scenarios:

  • 查找与 MyModelProjection1
  • 投影相匹配的(fun(m:MyModel)-> m.z.zInner = false)的文档
  • 找到与(fun(m:MyModel)-> m.x = 5)匹配并投影到 MyModelProjection2
  • 的文档
  • 找到所有带有投影的文档到 MyModelProjection1 MyModelProjection2
  • Find documents matching (fun (m: MyModel) -> m.z.zInner = false) with projection to MyModelProjection1
  • Find documents matching (fun (m: MyModel) -> m.x = 5) with projection to MyModelProjection2
  • Find ALL documents with projection to MyModelProjection1 or MyModelProjection2

推荐答案

您可以这样定义投影:

let projection1 =
    Builders<MyModel>.Projection.Expression(fun model ->
        { id = model.id; y = model.y })

let projection2 =
    Builders<MyModel>.Projection.Expression(fun model ->
        { id = model.id; x = model.x; z = model.z })

然后您可以通过以下方式使用它们:

You can then use them in the following way:

    let one =
        collection
            .Find(fun m -> m.z.zInner = false)
            .Project(projection1).ToEnumerable() |> List.ofSeq

    let two =
        collection
            .Find(fun m -> m.x = 5)
            .Project(projection2).ToEnumerable() |> List.ofSeq

    let three =
        collection
            .Find(fun _ -> true)
            .Project(projection1).ToEnumerable() |> List.ofSeq

    let four =
        collection
            .Find(fun _ -> true)
            .Project(projection1).ToEnumerable() |> List.ofSeq

这篇关于来自F#中的MongoDb Find的投影结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆