2016-11-09 8 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を超えるレコードを持っています。私はそれを小さなデータベースと考えています。それぞれの負荷は500msかかる。

リンクされたドキュメントをMongoDB C#Driverで読み込む方法はありますか?

答えて

1

2つのコレクションを結合する美しい方法はありません。
あなたの場合、ルックアップを使用すると、コレクションへの参加のスピードが向上します。

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; 
    } 
} 
関連する問題