using System; using MongoDB.Driver; using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; namespace TestAggregation { public class RunData { [BsonElement("_id")] [BsonId] public string Id { get; set; } [BsonElement("IdClx")] public string IdClx { get; set; } } public class RunDataFull : RunData { public Clx[] RefClx { get; set; } } public class Clx { [BsonElement("_id")] [BsonId] public string Id { get; set; } [BsonElement("BaseClx")] public string BaseClx { get; set; } [BsonElement("Name")] public string Name { get; set; } } public class ClxFull : Clx { public Clx[] RefBase { get; set; } } class Program { static void Main(string[] args) { // create the data RunData myRunData = new RunData(); myRunData.Id = "1"; myRunData.IdClx = "2"; Clx myClx = new Clx(); myClx.Id = "2"; myClx.BaseClx = "BaseClx"; myClx.Name = "MyClx"; Clx baseClx = new Clx(); baseClx.Id = "3"; baseClx.BaseClx = null; baseClx.Name = "BaseClx"; // write in the DB var client = new MongoClient("mongodb://localhost"); var db = client.GetDatabase("testDbAggr"); db.DropCollection("clxColl"); var clxColl = db.GetCollection("clxColl"); clxColl.InsertOne(myClx); clxColl.InsertOne(baseClx); db.DropCollection("runColl"); var runColl = db.GetCollection("runColl"); runColl.InsertOne(myRunData); // queries var filter = Builders.Filter.Ne("BaseClx", null) ; var clxList = clxColl .Aggregate() .Match(filter) .Lookup( clxColl, m => m.BaseClx, c => c.Name, (ClxFull m) => m.RefBase ) .ToList(); var runDataList = runColl .Aggregate() .Lookup( clxColl, m => m.IdClx, c => c.Id, (RunDataFull m) => m.RefClx ) .ToList(); Console.WriteLine("Done!"); } } }