Фильтр в MongoDB - PullRequest
       16

Фильтр в MongoDB

1 голос
/ 11 марта 2019

У меня есть эта модель:

 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 Ответ

1 голос
/ 11 марта 2019

Самый простой способ создать этот запрос строго типизированным способом - запустить 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("...")
        }
    }
]
...