2015-10-04 34 views
5

Muszę uzyskać drobne dane z każdego dokumentu mam w bazie danych, ale nadal chcę zmniejszyć ruch, aby zapobiec "Table-Scan" (tylko termin, wiem, że nie tabele) .C# mongo 2.0 zmniejszyć ruch FindAsync

Mam zbiór powiedzmy "Książki" (tylko dlatego, że wszyscy używają go do podania przykładów), teraz moim problemem jest to, że chcę tylko tytuły książek z danego autora.

var filter = Builders<Book>.Filter.Eq(n => n.Author, AuthorId); 

      List<string> books = new List<string>(); 

      using (var cursor = await BooksCollection.FindAsync(filter)) 
      { 
       while (await cursor.MoveNextAsync()) 
       { 
        var batch = cursor.Current; 
        foreach (Book b in batch) 
         books.Add(b.Title); 
       } 
      } 

Ale kiedy skanuję cały wynik zbiórki, używam dużych porcji danych, prawda? Załóżmy, że nie są to książki, ale całe sieci gridowe i każdy dokument ma około 5-10 MB, a ja mam ich tysiące ... jak mogę zmniejszyć ruch tutaj, bez przechowywania tych danych w innej kolekcji?

Edycja Myślę, że nazywa się "Widoki" w bazie danych SQL.

Odpowiedz

8

Można zmniejszyć rozmiar zwracanych dokumentów poprzez projection które można ustawić w parametrze FindOptions z FindAsync uwzględnione tylko pola potrzebne są:

var filter = Builders<Book>.Filter.Eq(n => n.Author, AuthorId); 
// Just project the Title and Author properties of each Book document 
var projection = Builders<Book>.Projection 
    .Include(b => b.Title) 
    .Include(b => b.Author) 
    .Exclude("_id"); // _id is special and needs to be explicitly excluded if not needed 
var options = new FindOptions<Book, BsonDocument> { Projection = projection }; 

List<string> books = new List<string>(); 

using (var cursor = await BooksCollection.FindAsync(filter, options)) 
{ 
    while (await cursor.MoveNextAsync()) 
    { 
     var batch = cursor.Current; 
     foreach (BsonDocument b in batch) 
      // Get the string value of the Title field of the BsonDocument 
      books.Add(b["Title"].AsString); 
    } 
} 

Zauważ, że powracające dokumenty są BsonDocument obiekty zamiast Book obiektów, ponieważ zawierają tylko wyświetlane pola.