using System; using MongoDB.Driver; using MongoDB.Bson; using System.Collections.Generic; using System.Linq.Expressions; using System.Linq; using MongoDB.Bson.Serialization.Attributes; namespace MongoPipeline { class Program { static void Main(string[] args) { var client = new MongoClient("mongodb://localhost:27017/"); var db = client.GetDatabase("testing"); var collection = db.GetCollection("entries"); var first = new Sample() { EntryName = "Common", ReferenceComponents = new List() { new ReferenceComponents() { Name = "Animal", Ref = "Cat/1234" }, new ReferenceComponents() { Name = "Animal", Ref = "Dog/1234"}, new ReferenceComponents() { Name = "Plant", Ref = "Tomato/1234"} } }; var second = new Sample() { EntryName = "Common", ReferenceComponents = new List() { new ReferenceComponents() { Name = "Animal", Ref = "Elephant/1234" }, new ReferenceComponents() { Name = "Animal", Ref = "Jaguar/1234"}, new ReferenceComponents() { Name = "Innanimate", Ref = "Rock/1234"} } }; collection.InsertOne(first); collection.InsertOne(second); var matchFilter = Builders.Filter.Where(item => item.EntryName == "Common"); var projectionFilter = Builders.Projection.Expression((item) => item.ReferenceComponents.Where(component => component.Name == "Animal")); var pipeline = collection .Aggregate() .Match(matchFilter) .Project(projectionFilter); var result = pipeline.ToList(); Console.Write(result); } } public class Sample { [BsonId] public ObjectId EntryId { get; set; } [BsonElement("name")] public string EntryName { get; set; } [BsonElement("ref")] public List ReferenceComponents { get; set; } } public class ReferenceComponents { [BsonElement("comp_name")] public string Name { get; set; } [BsonElement("comp_ref")] public string Ref { get; set; } } }