2016-11-09 85 views
1

我有一个正在由MongoDB驱动程序加载的文档。加载链接的文档MongoDB驱动程序

问题是这个文件有另一个链接的文件由ObjectId

由于我的应用程序,我需要的头文件满载,我通过一个IEnumerable加载链接的文档如下:

IMongoDatabase Database { get; set; } 

public class Document1 { 
    [BsonId] 
    public ObjectId Id; 
    public ObjectId Document2Id; 

    [BsonIgnore] 
    public Document2 Document2; 
} 

public class Document2 { 
    [BsonId] 
    public ObjectId Id; 
    public string Foo; 
    public string Bar; 
} 

public IEnumerable<Document1> List() { 
    var 1documents = Database.GetCollection<Document1>("1documents"); 
    var 2documents = Database.GetCollection<Document2>("2documents"); 

    foreach(var document in 1documents.AsEnumerable()) { 
     document.Document2 = 2documents 
           .AsEnumerable() 
           .FirstOrDefault(d => d.ID == document.Document2Id); 
     yield return document; 
    } 
} 

我的问题是,文档2的负荷的时间过长。我有500多条记录,我认为它是一个小型数据库。每个负载需要500毫秒。

是否有任何其他方式通过MongoDB C#驱动程序加载链接的文件?

回答

1

没有美丽的方式来加入两个集合。
在你的情况下使用查找将有助于提高加入收藏的速度。

public IEnumerable<Document1> List() 
{ 
    var document1Collection = Database.GetCollection<Document1>("Document1"); 
    var document2Collection = Database.GetCollection<Document2>("Document2"); 

    var document2Lookup = document2Collection.AsQueryable().ToLookup(x => x.Id); 
    foreach (var document1 in document1Collection.AsQueryable()) 
    { 
     document1.Document2 = document2Lookup[document1.Document2Id].FirstOrDefault(); 
     yield return document1; 
    } 
}