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

马坎皮拉米

想象一下,在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中通常的方法是使用投影。它与JSON查询(如)完美配合find({}, {"Field1": 1, "Next1.Field2": 1, "Next1.Next2.Field3": 1})我们得到了完整的对象层次结构,但是缺少了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-投影只是错误的。它似乎仅在两个级别上起作用,并且停止在两个级别之后添加projection子句的前缀。

你知道是否有可能做一个我想要的表情?谢谢!

马坎皮拉米

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我们可以更改视频驱动程序吗?

来自分类Dev

在MongoDB C#驱动程序2.2中使用AsQueryable进行投影

来自分类Dev

我们可以使用mongodb将对象值推送到$ project中吗

来自分类Dev

我们可以理解吗?

来自分类Dev

我们可以关闭MouseEvents吗?

来自分类Dev

我们可以在Python中使用C代码吗?

来自分类Dev

我们可以在mongodb中更新/更新记录吗?数据源是kafka

来自分类Dev

我们可以一起编写mongodb crud查询和聚合查询吗?

来自分类Dev

我们可以应用索引来匹配mongoDB中的某个值吗

来自分类Dev

我们可以在mongodb中将自己的标识符(id)作为mysql创建吗

来自分类Dev

我们可以将新记录按降序保存在mongodb中吗

来自分类Dev

我们可以在代码中执行多个程序吗?

来自分类Dev

我们可以添加多个SQL驱动程序,例如OTD,MySQL Connector / J,PostgreSQL,SyBase JConnect等吗?

来自分类Dev

我们可以将pagefactory与Selenium Web驱动程序中的断言绑定吗?

来自分类Dev

我们可以在StateMachineBuilder中使用UmlStateMachineModelFactory吗

来自分类Dev

我们可以在Azure中使用PostgREST API吗

来自分类Dev

我们可以在Getters中使用代表吗

来自分类Dev

我们可以在If条件中使用IsDisplayed方法吗?

来自分类Dev

我们可以在BETWEEN中使用CASE吗?

来自分类Dev

我们可以在 Angular 5 中使用 Cropit 吗?

来自分类Dev

我们可以在 JavaScript 中使用 doNotRemoveChild() 吗?

来自分类Dev

我们可以在Mac上将docker-image与hyperkit驱动程序一起使用吗?

来自分类Dev

如果供应商未提供驱动程序,我们可以使用jdbc吗?

来自分类Dev

如果可用的驱动程序,我们可以设置FFMPEG硬件加速,否则使用默认值吗?

来自分类Dev

我们可以将我们的编程放在android的doInBackground()中吗

来自分类Dev

我们可以在“Quickblox”中重新加入我们错过的群组通话吗?

来自分类Dev

我们可以在c#多态中使用不同的方法返回类型吗

来自分类Dev

我们可以在C#中使用点命令(SQlite的特殊命令)吗?

来自分类Dev

我们可以在文件中存储多个对象吗?

Related 相关文章

  1. 1

    我们可以更改视频驱动程序吗?

  2. 2

    在MongoDB C#驱动程序2.2中使用AsQueryable进行投影

  3. 3

    我们可以使用mongodb将对象值推送到$ project中吗

  4. 4

    我们可以理解吗?

  5. 5

    我们可以关闭MouseEvents吗?

  6. 6

    我们可以在Python中使用C代码吗?

  7. 7

    我们可以在mongodb中更新/更新记录吗?数据源是kafka

  8. 8

    我们可以一起编写mongodb crud查询和聚合查询吗?

  9. 9

    我们可以应用索引来匹配mongoDB中的某个值吗

  10. 10

    我们可以在mongodb中将自己的标识符(id)作为mysql创建吗

  11. 11

    我们可以将新记录按降序保存在mongodb中吗

  12. 12

    我们可以在代码中执行多个程序吗?

  13. 13

    我们可以添加多个SQL驱动程序,例如OTD,MySQL Connector / J,PostgreSQL,SyBase JConnect等吗?

  14. 14

    我们可以将pagefactory与Selenium Web驱动程序中的断言绑定吗?

  15. 15

    我们可以在StateMachineBuilder中使用UmlStateMachineModelFactory吗

  16. 16

    我们可以在Azure中使用PostgREST API吗

  17. 17

    我们可以在Getters中使用代表吗

  18. 18

    我们可以在If条件中使用IsDisplayed方法吗?

  19. 19

    我们可以在BETWEEN中使用CASE吗?

  20. 20

    我们可以在 Angular 5 中使用 Cropit 吗?

  21. 21

    我们可以在 JavaScript 中使用 doNotRemoveChild() 吗?

  22. 22

    我们可以在Mac上将docker-image与hyperkit驱动程序一起使用吗?

  23. 23

    如果供应商未提供驱动程序,我们可以使用jdbc吗?

  24. 24

    如果可用的驱动程序,我们可以设置FFMPEG硬件加速,否则使用默认值吗?

  25. 25

    我们可以将我们的编程放在android的doInBackground()中吗

  26. 26

    我们可以在“Quickblox”中重新加入我们错过的群组通话吗?

  27. 27

    我们可以在c#多态中使用不同的方法返回类型吗

  28. 28

    我们可以在C#中使用点命令(SQlite的特殊命令)吗?

  29. 29

    我们可以在文件中存储多个对象吗?

热门标签

归档