Considere la siguiente estructura de objeto almacenada como documentos:
public class Foo { public string Id { get; set; } public ICollection<FooBar> Bars { get; set; } // ... } public class FooBar { public string BarId { get; set; } // ... } Usando una consulta de estilo LINQ con el controlador, puedo Find todos los Foo que contienen un FooBar BarId como este:
var foos = await m_fooCollection.Find( f => f.Bars.Any( fb => fb.BarId == "123") ).ToListAsync(); ¿Cómo puedo lograr esta misma consulta usando FilterDefinitionBuilder en lugar de LINQ en línea en Find ?
La consulta que debe realizar utiliza el operador de consulta $elemMatch .
Entonces, esta consulta usando una expresión lambda
var findFluent = collection.Find(f => f.Bars.Any(fb => fb.BarId == "123")); Es equivalente a esta consulta usando FilterDefinitionBuilder :
var findFluent = collection.Find(Builders<Foo>.Filter.ElemMatch( foo => foo.Bars, foobar => foobar.BarId == "123"));