在嵌入式文档上应用过滤器后,选择文档中的字段

时间:2018-11-21 14:23:55

标签: c# mongodb nested

能否让我知道以下查询的C#等效项?

db.RolesNPerm.find(
   { "Roles.Name":{$in:[ "PO","role1","TO"] }},
   { _id: 1, ParentId: 1 }
)

如果嵌入式文档(_id)中的ParentId与其中的任何值匹配,我试图选择记录中的字段(NameRoles)列表。

这是我的MongoDB文档

{
    "_id" : "1",
    "ParentId" : "par1",
    "Roles" : [ 
        {
            "Name" : "PO",
            "_id" : "5bc08ee1f12541c3aaa03084"
        }
    ]
}

以下是我查询的结果,因为Role.Name与名称列表中的“ PO”匹配。

{
    "_id" : "1",
    "ParentId" : "par1"
}

1 个答案:

答案 0 :(得分:1)

(至少)有两种方法可以做到这一点:

您可以使用Builder类来构建过滤器和投影部件。问题是您不能使用强类型的lambda表达式来表示Roles.Name部分,因此您可以使用FieldDefinition类型作为后备

var values = new[] { "PO", "role1", "TO" };
FieldDefinition<Model, string> field = "Roles.Name";

var filter = Builders<Model>.Filter.In(field, values);
var project = Builders<Model>.Projection.Combine(
        Builders<Model>.Projection.Include(x => x._id),
        Builders<Model>.Projection.Include(x => x.ParentId)
    );

var result = Col.Find(filter).Project(project).ToList();

或者,您可以使用LINQ语法,该语法将转换为相关的MongoDB命令:

var values = new[] { "PO", "role1", "TO" };

var q = from doc in Col.AsQueryable()
        where doc.Roles.Any(x => values.Contains(x.Name))
        select new Model6()
        {
            ParentId = doc.ParentId,
            _id = doc._id
        };

var result = q.ToList();