使用MongoDB和C#在数组中查询深度嵌套的对象

问题描述 投票:1回答:1

我对MongoDB相当陌生,已经面临着艰巨的挑战。我正在尝试从具有对象的数组中的对象中获取一个元素(如果有道理)。这是文档的外观以及我要获取的内容:

https://i.imgur.com/W4Wfmhc.png

所以基本上结构如下:

  • OptionMenus
    • OptionMenuSubject
      • OptionMenuItem

要获得我匹配的OptionMenuItem,可以使用MongoDB Compass工具中的聚合管道工具将其拉出

[{
    $unwind: {
        path: '$subjects'
    }
}, {
    $unwind: {
        path: '$subjects.items'
    }
}, {
    $project: {
        _id: '$subjects.items._id',
        item: '$subjects.items'
    }
}, {
    $match: {
        _id: ObjectId('5e6eaef8ae35a418f4f6dbd4')
    }
}]

然后我尝试将其翻译成C#并没有成功,这是我所学到的:

        var optionMenuItem = await collection.Aggregate()
           .Unwind<OptionMenu, OptionMenuSubject>(i => i.Subjects)
           .Unwind<OptionMenuSubject, OptionMenuItem>(i => i.Items)
           .Match(i => i.Id == id)
           .ToListAsync();

如果有人知道我在做什么错或如何解决这个问题,将不胜感激:)

c# mongodb mongodb-.net-driver
1个回答
0
投票

似乎应该更改此行:

Unwind<OptionMenuSubject, OptionMenuItem>(i => i.Items)

我认为它会产生:

{
    $unwind: {
        path: '$items'
}

这是错误的路径,因为您之前没有运行$replaceRoot,并且在第一个items之后,items数组将嵌套在$unwind对象内部。尝试更改您的C#类型,以便表达式树读取器将能够构建$unwind路径,例如$subjects.items

Unwind<OptionMenuSubject, OptionMenuItem>(i => i.Subjects.Items)
© www.soinside.com 2019 - 2024. All rights reserved.