MongoDB C#驱动程序-如何查询子文档数组上的属性
假设我在MongoDB中有以下文档结构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#驱动程序运行此查询,
{
_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));
并保存几次击键。你知道为什么位置运算符不能用这种方式工作吗?可能是重复的