我有这个模型:
public class DraftItem
{
public List<DraftNode> Nodes{ get; set; }
}
public class DraftNodes
{
...
public List<DraftTerm> Properties{ get; set; }
}
public class DraftTerm
{
public ObjectId Id{ get; set; }
public String Name { get; set; }
}
我需要在MongoDB中根据DraftTerm筛选属性-ID 我已经尝试过像这样制作过滤器,但是它不起作用:
FilterDefinition<DraftNodes> filter = Builders<DraftNodes>.Filter.ElemMatch(z => z.Properties, a => a.Id == id);
await db.GetCollection<DraftItem>("collection name")
.Find(filter )
.ForEachAsync(async document =>
{..}
在mongoDB中,如果我这样过滤,它将起作用:
db.getCollection('collection name').find({'nodes.properties.id': ObjectId('...')})
是否可以使用ElemMatch和Filter进行过滤?
答案 0 :(得分:1)
以强类型方式构建此查询的最简单方法是在集合上运行AsQueryable()
,然后使用LINQ语法,如下所示:
var query = Col.AsQueryable().Where(
x => x.Nodes.Any(n => n.Properties.Any(q => q.Id == objectId)));
var result = query.ToList();
运行此命令后,您可以签入MongoDB profiler,将其转换为Aggregation Framework的$match
阶段,就像您的查询一样:
"pipeline" : [
{
"$match" : {
"Nodes.Properties._id" : ObjectId("...")
}
}
]