2015-10-04 20 views
5

Tôi phải lấy một số dữ liệu nhỏ từ mỗi tài liệu tôi có trong cơ sở dữ liệu nhưng tôi vẫn muốn giảm lưu lượng truy cập để ngăn chặn "Table-Scan" (chỉ là thuật ngữ, tôi biết không phải bảng của nó) .C# mongo 2.0 giảm lưu lượng truy cập của FindAsync

Tôi có một bộ sưu tập cho phép nói "Sách" (chỉ vì mọi người đang sử dụng nó để đưa ra ví dụ), bây giờ, vấn đề của tôi là tôi chỉ muốn sách có tiêu đề tác giả.

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

Nhưng khi quét toàn bộ kết quả thu thập, tôi đang sử dụng khối dữ liệu lớn phải không? giả sử đó không phải là sách nhưng toàn bộ mạng lưới và mỗi tài liệu là khoảng 5-10 MB và tôi có hàng nghìn chúng .. làm cách nào để giảm lưu lượng truy cập ở đây mà không lưu trữ dữ liệu này mà tôi cần trong bộ sưu tập khác?

Chỉnh sửa Tôi nghĩ nó được gọi là "Chế độ xem" trong cơ sở dữ liệu SQL.

Trả lời

8

Bạn có thể giảm kích thước của các tài liệu trả về thông qua projection mà bạn có thể thiết lập trong FindOptions tham số của FindAsync để chỉ bao gồm các lĩnh vực bạn cầ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); 
    } 
} 

Lưu ý rằng các tài liệu trở lại là BsonDocument đối tượng thay vì Book đối tượng vì chúng chỉ chứa các trường được chiếu.

Các vấn đề liên quan