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

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

假设我在 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<Project>.EQ(p => p.Id, rootProjectId) 的事情这样我就可以改用成员表达式,让类映射告诉驱动程序它应该使用“Ancestors._id”。

最佳答案

ElemMatch 在这种情况下是您的 friend 。

尝试以下操作:

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

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

关于c# - MongoDB C# 驱动程序 - 如何查询子文档数组的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18766412/

相关文章:

mongodb - 映射 MongoDB 中的数组

mongodb - 获取最近的姓名、分数

c# - 如何从 Bson 文档中获取值列表?

c# - 使用 `in` 运算符从 id 列表中查找所有 MongoDB 文档

mongodb - 蒙戈 : Selecting X elements from an array placed in an object

C# - 通用操作?

c# - 在列表中双击

C# System.Array 如何计算或查找它有多少维度?

c# - 不同项目中的 Web 用户控件

java - 通过 SpringData MongoDB 进行验证的方法