MongoDB C#驱动程序 - 如何查询子文档数组的属性

本文关键字:文档 数组 属性 查询 驱动程序 何查询 MongoDB | 更新日期: 2023-09-27 18:31:08

假设我在MongoDB中有以下文档结构。

{
    _id: ####,
    Ancestors: [
        { _id: 1, Name: "asdf" },
        { _id: 2, Name: "jkl;" },
        ...
    ]
}

我想找到每个包含祖先的文档,其中祖先的_id是 2。

我可以使用以下方法在 mongo shell 中运行此查询:db.projects.find({"Ancestors._id": 2})

我还可以使用官方 C# 驱动程序运行此查询:Query.EQ("Ancestors._id", new BsonInt32(rootProjectId))

这是我的POCO;我使用的实际类具有比这更多的属性,但我不想用不必要的细节来混淆问题:

public class Project
{
    public int Id { get; set; }
    public List<ProjectRef> Ancestors { get; set; }
}
public class ProjectRef
{
    public int Id { get; set; }
    public string Name { get; set; }
}

我的问题是:如何使用 C# 驱动程序编写强类型查询,以便不必将"Ancestors._id"作为字符串传入? 我希望能够执行类似 Query<Project>.EQ(p => p.Id, rootProjectId) 的操作,以便我可以改用成员表达式,并让类映射告诉驱动程序它应该使用"Ancestors._id"。

MongoDB C#驱动程序 - 如何查询子文档数组的属性

在这种情况下,

ElemMatch是你的朋友。

请尝试以下操作:

var ancestorsQuery = Query<ProjectRef>.EQ(pr => pr.Id, rootProjectId);
var finalQuery = Query<Project>.ElemMatch(p => p.Ancestors, builder => ancestorsQuery));

在项目集合的查找命令中使用 finalQuery。