我对 MongoDB 还很陌生,并且已经面临着一个令人汗颜的挑战。我正在尝试从带有对象的数组中获取一个元素,该数组包含带有对象的数组内部的对象(如果有意义的话)。这就是文档的样子以及我想要得到的:
所以基本上结构如下:
- 选项菜单
- 选项菜单主题
- 选项菜单项
- 选项菜单主题
为了获取 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/