2015-10-04 16 views
5

Veritabanında sahip olduğum her belgeden bazı küçük veriler almalıyım ancak hala "Tablo Tarama" işlevini engellemek için trafiği azaltmak istiyorum (yalnızca terim, tabloları bilmiyorum) .C# mongo 2.0 FindAsync trafiğini azaltın

"Kitaplar" diyebileceğimiz bir koleksiyonum var (sadece herkesin örnek vermek için kullandığı için), şimdi benim sorunum, yalnızca verilmiş bir yazarla birlikte kitapların kitaplarını istiyorum.

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

Ancak, tüm koleksiyon sonucunu taradığımda, büyük veri kümeleri kullanıyorum, değil mi? kitapların değil, tüm grid ağlarının ve her bir belgenin yaklaşık 5-10 MB olduğunu varsayalım ve binlerce tane var. Buradaki trafiği başka bir koleksiyonda sakladığım bu veriyi saklayamadan nasıl azaltabilirim?

Düzenleme SQL veritabanında onun sözde "Görünümler" düşünüyorum. iade belgeler BsonDocument nesneler yerine olduklarını

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

Not:

cevap

8

Sen sadece FindAsync arasında FindOptions parametresinde ayarlayabilirsiniz projection üzerinden geri belgelerin boyutunu azaltabilir ihtiyacınız alanları şunlardır Sadece yansıtılan alanları içerdikleri için Book nesneler.