来自F#中的MongoDb Find的投影结果 [英] Projecting results from MongoDb Find in F#
本文介绍了来自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.x = 5)
匹配并投影到MyModelProjection2
的文档 - 找到所有带有投影的文档到
MyModelProjection1
或MyModelProjection2
(fun(m:MyModel)-> m.z.zInner = false)
的文档- Find documents matching
(fun (m: MyModel) -> m.z.zInner = false)
with projection toMyModelProjection1
- Find documents matching
(fun (m: MyModel) -> m.x = 5)
with projection toMyModelProjection2
- Find ALL documents with projection to
MyModelProjection1
orMyModelProjection2
推荐答案
您可以这样定义投影:
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屋!
查看全文