2015-10-04 5 views
5

Ich muss einige kleinere Daten von jedem Dokument in der Datenbank bekommen, aber ich möchte immer noch den Datenverkehr reduzieren, um "Table-Scan" zu verhindern (nur der Begriff, ich weiß es nicht Tabellen) .C# mongo 2.0 Verkehr von FindAsync reduzieren

Ich habe eine Sammlung von lets sagen "Bücher" (nur weil jeder es verwenden, um Beispiele zu geben), jetzt, mein Problem ist, dass ich nur die Bücher Titel mit bestimmten Autor wollen.

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

Aber, wenn ich das gesamte Sammlungsergebnis scanne, benutze ich große Brocken von Daten, nicht wahr? Nehmen wir an, das sind keine Bücher, sondern ganze Grid-Netzwerke und jedes Dokument ist etwa 5-10 MB groß und ich habe Tausende von ihnen..wie kann ich den Verkehr hier reduzieren, ohne diese Daten in einer anderen Sammlung zu speichern?

Bearbeiten Ich denke, es heißt "Ansichten" in SQL-Datenbank.

Antwort

8

Sie können die Größe der zurückgegebenen Dokumente über projection reduzieren, die Sie im FindOptions Parameter von FindAsync nur festlegen können, umfassen die Felder, die Sie brauchen:

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

Beachten Sie, dass die zurückgegebenen Dokumente sind BsonDocument Objekte anstelle von Book Objekte, da sie nur die projizierten Felder enthalten.