在 MongoDB 中过滤

Filter in MongoDB

我有这个型号:

 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; }
 }

我需要根据 DraftTerm - Id 在 mongoDB 中过滤属性 我试过这样制作过滤器,但它不起作用:

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

以强类型方式构建此查询的最简单方法是 运行 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 它将被翻译到聚合框架的 $match 阶段,就像你的查询一样:

"pipeline" : [
    {
        "$match" : {
            "Nodes.Properties._id" : ObjectId("...")
        }
    }
]