在MongoDB中过滤

时间:2019-03-11 13:16:47

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

我有这个模型:

 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进行过滤?

1 个答案:

答案 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("...")
        }
    }
]