2015-10-04 13 views
5

Devo ottenere alcuni dati minori da ciascun documento che ho nel database ma voglio comunque ridurre il traffico per evitare "Table-Scan" (solo il termine, so che non è tabelle) .C# mongo 2.0 ridurre il traffico di FindAsync

Ho una raccolta di diciamo "Libri" (solo perché tutti la usano per fornire esempi), ora il mio problema è che voglio solo i titoli dei libri con un determinato autore.

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); 
       } 
      } 

Ma, quando la scansione l'intero risultato di raccolta, sto utilizzando grandi blocchi di dati, non è vero? Supponiamo che non si tratti di libri ma di intere reti di rete e ogni documento è di circa 5-10 MB e ne ho migliaia ... come posso ridurre il traffico qui, senza memorizzare questi dati di cui ho bisogno in un'altra raccolta?

Modifica Penso che sia chiamato "Visualizzazioni" nel database SQL.

risposta

8

È possibile ridurre le dimensioni dei documenti restituiti tramite projection quale è possibile impostare nel parametro FindOptions di FindAsync solo includere i campi necessari:

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); 
    } 
} 

Nota che i documenti restituiti sono BsonDocument oggetti anziché ai Book oggetti poiché contengono solo i campi proiettati.