Teniendo en cuenta lo siguiente, ¿cómo devuelvo todos los Foos que contienen Bars que tienen TypeOfBar == "Big" y hago que las Foos' Bars se limiten solo a aquellas Bars que tienen TypeOfBar == "Big" también?
public class Foo { public string _id { get; set; } public List<Bar> Bars { get; set; } } public class Bar { public string _id { get; set; } public string TypeOfBar { get; set; } }Puedo obtener fácilmente la primera parte (todos los Foos con barras de un tipo en particular):
var client = new MongoClient("myconnectionstring"); var db = client.GetDatabase("myDb"); var collection = db.GetCollection<Foo>("Foos"); var foos = collection.AsQueryable().Where(x => x.Bars.Any(b => b.TypeOfBar == "Big"));Sin embargo, estoy teniendo dificultades para descubrir cómo hacer que la base de datos también devuelva los Foos con una lista filtrada de barras.
Si desea filtrar solo estos Foos que tienen el tipo "Grande", debe aplicar ElemMatch Projection:
var res = collection.Find(x => x.Bars.Any(b => b.TypeOfBar == "Big")) .Project(Builders<Foo>.Projection.ElemMatch(x=>x.Bars, b=>b.TypeOfBar == "Big"));El problema que tendrá con él: la proyección devolverá BSon. Quizás eso es lo que necesita y podría vivir con eso, si no, debería deserializar Bson a su clase Foo. Consulta completa que me parecía:
var res = collection.Find(x => x.Bars.Any(b => b.TypeOfBar == "Big")) .Project(Builders<Foo>.Projection.ElemMatch(x=>x.Bars, b=>b.TypeOfBar == "Big")) .ToEnumerable() .Select(b=>BsonSerializer.Deserialize<Foo>(b)) .ToList();