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

MongoDB C#驱动程序-如何查询子文档数组上的属性,c#,mongodb,mongodb-.net-driver,mongodb-query,C#,Mongodb,Mongodb .net Driver,Mongodb Query,假设我在MongoDB中有以下文档结构 { _id: ####, Ancestors: [ { _id: 1, Name: "asdf" }, { _id: 2, Name: "jkl;" }, ... ] } 我想找到每个包含祖先的文档,其中祖先的_id为2 我可以使用以下命令在mongo shell中运行此查询:db.projects.find({“祖先”.\u id:2}) 我还可以使用官方的C#驱动程序运行此查询,

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

{
    _id: ####,
    Ancestors: [
        { _id: 1, Name: "asdf" },
        { _id: 2, Name: "jkl;" },
        ...
    ]
}
我想找到每个包含祖先的文档,其中祖先的_id为2

我可以使用以下命令在mongo shell中运行此查询:
db.projects.find({“祖先”.\u id:2})

我还可以使用官方的C#驱动程序运行此查询,使用以下命令:
query.EQ(“祖先._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; }
}
公共类项目
{
公共int Id{get;set;}
公共列表祖先{get;set;}
}
公共类ProjectRef
{
公共int Id{get;set;}
公共字符串名称{get;set;}
}

我的问题是:如何使用C#驱动程序编写强类型查询,从而不必以字符串形式传入“祖先.#id”?我希望能够执行类似于
Query.EQ(p=>p.Id,rootProjectId)
的操作,这样我就可以使用一个成员表达式,让类映射告诉驱动程序它应该使用“祖先”。在这种情况下,

ElemMatch是您的朋友

请尝试以下操作:

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

在Projects集合上的Find命令中使用finalQuery。

提供给
query.ElemMatch()
的第二个参数的查询生成器是由第一个参数键入的,因此如果您想将整个查询编写为一条语句,可以执行以下操作:
var finalQuery=query.ElemMatch(p=>p.祖先,builder=>builder.EQ(pr=>pr.Id,rootProjectId));
并保存几次击键。你知道为什么位置运算符不能用这种方式工作吗?可能是重复的