繁体   English   中英

我们可以在带有 MongoDB c# 驱动程序的投影中使用多个嵌套级别吗?

[英]Can we use multiple nested levels inside a projection with the MongoDB c# driver?

想象一下,我们在 c#7,dotnet core 3.1 中有以下类,对应于存储在 MongoDB 集合中的数据:

public class Level1
{
    public string Field1 {get; set;}
    public IEnumerable<Level2> Next1 {get; set;}
}

public class Level2
{
    public string Field2 {get; set;}
    public IEnumerable<Level3> Next2 {get; set;}
}

public class Level3
{
    public string Field3 {get; set;}
    public string Field4 {get; set;}
}

出于优化原因,我们要检索 Field3 而不是 Field4,以及 Level1 & Level2 的所有数据。 (当然,这是一种简化:在真实情况下,我们实际上想要忽略很多数据)。

为此,Mongo 中的常用方法是使用投影。 它适用于像find({}, {"Field1": 1, "Next1.Field2": 1, "Next1.Next2.Field3": 1})这样的 JSON 查询。 我们得到了完整的对象层次结构,但缺少 Field4,即我们想要的。

但是,在尝试使用最新版本的官方驱动程序在 c# 中执行此操作时,我被卡住了。 我显然可以只使用原始 JSON 查询并且它可以工作 - 但我会错过驱动程序管理映射的所有优点,例如重构后的字段名称。 所以我们想使用表达式。

我试过这个:

var result = db.GetCollection<Level1>("mycollection")
    .Find("{}")
    .Project(Builders<Level1>.Projection.Expression(p => new Level1
    {
        Field1 = p.Field1,
        Next1 = p.Next1.Select(s => new Level2
        {
            Field2 = s.Field2,
            Next2 = s.Next2.Select(r => new Level3
            {
                Field3 = r.Field3,
            },
        },
    }));    

但是,这会生成以下意外的 JSON:

find({}
}, {
    "Field1": 1,
    "Next2.Field3": 1,
    "Next1.Next2": 1,
    "Next1.Field2": 1
})

当然,这意味着 Field4 没有被过滤——投影是错误的。 它似乎只在两个级别上起作用,并且在两个级别之后停止为投影子句添加前缀。

你知道是否有可能用表达式做我想做的事吗? 谢谢!

我们在 MongoDB 开了一个案例,他们已经确认这是他们这边的一个错误,在他们的 JIRA 中引用

没有使用对象表达式的已知解决方法,因此我们现在使用 Include() 并将在驱动程序修复时更新。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM