加载链接文档MongoDB驱动程序

时间:2016-11-09 15:41:19

标签: c# mongodb mongodb-.net-driver

我有一个由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;
    }
}

我的问题是Document2的负载耗时太长。我有500多条记录,我认为这是一个小型数据库。每个负载需要500毫秒。

有没有其他方法可以通过MongoDB C#Driver加载链接文档?

1 个答案:

答案 0 :(得分: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;
    }
}