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

标签 c# mongodb mongodb-.net-driver

我对 MongoDB 还很陌生,并且已经面临着一个令人汗颜的挑战。我正在尝试从带有对象的数组中获取一个元素,该数组包含带有对象的数组内部的对象(如果有意义的话)。这就是文档的样子以及我想要得到的:

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

所以基本上结构如下:

  • 选项菜单
    • 选项菜单主题
      • 选项菜单项

为了获取 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();

如果有人知道我做错了什么或者我如何才能做到这一点,我们将非常感激:)

最佳答案

这就是我最终解决这个问题的方法。这不是我最自豪的作品,因为它没有强类型,但它有效:

var collection = Database.GetCollection<BsonDocument>(_collectionName);    
var query = await collection.Aggregate()
                .Match(i => i["subjects.items._id"] == ObjectId.Parse(id))
                .Unwind(i => i["subjects"])
                .Unwind(i => i["subjects.items"])
                .Match(i => i["subjects.items._id"] == ObjectId.Parse(id))
                .ReplaceRoot(i => i["subjects.items"])
                .FirstOrDefaultAsync();

关于c# - 使用 MongoDB 和 C# 查询数组中深度嵌套的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60747587/

相关文章:

c# - WPF - DLL 的静态链接

c# - VS2010 调试器陷入困境

mongodb - $divide 累加器是一元运算符

c# - 带有 MongoDB API 的 CosmosDB

c# - MongoDB 添加数组到 BsonDocument

c# - 在 Asp.Net 本地化中使用加纳语言环境

javascript - findOneAndUpdate mongodb 推送到现有数组

javascript - Meteor-如何独立于包提供的帮助器来使用 blog_posts 集合

c# - MongoDB C# 驱动程序 MongoCredential 对象

c# - 将数据从 Excel 传输到 dataGridView