在对嵌入文档应用筛选后选择文档中的字段



你能告诉我下面查询的C#等价物吗?

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

如果嵌入文档(Roles(中的Name与列表中的任何值匹配,我将尝试选择记录中的字段(_idParentId(。

这是我的MongoDB文档

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

以下是我作为角色查询的结果。名称与名称列表中的"PO"匹配。

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

至少有两种方法:

您可以使用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();

最新更新