能否让我知道以下查询的C#等效项?
db.RolesNPerm.find(
{ "Roles.Name":{$in:[ "PO","role1","TO"] }},
{ _id: 1, ParentId: 1 }
)
如果嵌入式文档(_id
)中的ParentId
与其中的任何值匹配,我试图选择记录中的字段(Name
和Roles
)列表。
这是我的MongoDB文档
{
"_id" : "1",
"ParentId" : "par1",
"Roles" : [
{
"Name" : "PO",
"_id" : "5bc08ee1f12541c3aaa03084"
}
]
}
以下是我查询的结果,因为Role.Name与名称列表中的“ PO”匹配。
{
"_id" : "1",
"ParentId" : "par1"
}
答案 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();