【问题标题】:MongoDB C# driver - how to query a property on an array of subdocumentsMongoDB C# 驱动程序 - 如何查询子文档数组的属性
【发布时间】:2013-09-16 23:11:49
【问题描述】:

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

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

我想找到每个包含 Ancestor 的文档,其中 Ancestor 的 _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&lt;Project&gt;.EQ(p =&gt; p.Id, rootProjectId) 这样的事情,这样我就可以使用成员表达式,并让类映射告诉驱动程序它应该使用“Ancestors._id”。

【问题讨论】:

标签: c# mongodb mongodb-.net-driver mongodb-query


【解决方案1】:

ElemMatch 在这种情况下是你的朋友。

尝试以下方法:

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

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

【讨论】:

  • 提供给Query&lt;&gt;.ElemMatch()的第二个参数的查询生成器是由第一个参数输入的,所以如果你想把整个查询写成一条语句,你可以这样做:var finalQuery = Query&lt;Project&gt;.ElemMatch(p =&gt; p.Ancestors, builder =&gt; builder.EQ(pr =&gt; pr.Id, rootProjectId));并保存几次击键。
  • 知道为什么位置运算符不能通过这种方式工作吗?
猜你喜欢
  • 1970-01-01
  • 2012-05-15
  • 2012-11-02
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多