2011-12-09 24 views

Trả lời

39

Cập nhật: Với phiên bản driver mới (1.6 trở lên) bạn có thể tránh tên lĩnh vực cứng mã hóa và sử dụng LINQ thay vì:

var users = usersCollection.FindAllAs<T>() 
          .SetFields(Fields<T>.Include(e => e.Id, e => e.Name)); 

Bạn có thể làm điều đó thông qua SetFields phương pháp của con trỏ MongoDB:

var users = usersCollection.FindAllAs<T>() 
       .SetFields("_id") // include only _id 
       .ToList(); 

Bằng cách defaul SetFileds bao gồm các trường được chỉ định. Nếu bạn cần loại trừ các lĩnh vực nhất định, bạn có thể sử dụng:

var users = usersCollection.FindAllAs<T>() 
       .SetFields(Fields.Exclude("_id")) // exclude _id field 
       .ToList(); 

Hoặc bạn có thể sử dụng chúng với nhau:

var users = usersCollection.FindAllAs<T>() 
       .SetFields(Fields.Exclude("_id") // exclude _id field 
            .Include("name")) // include name field 
       .ToList(); 
27

Bắt đầu từ v2.0 của trình điều khiển có một API async chỉ mới. API cũ sẽ không còn được sử dụng vì nó là mặt tiền chặn trên API mới và không còn được dùng nữa.

Cách được đề xuất hiện tại để bao gồm hoặc loại trừ một số thành viên nhất định là sử dụng phương thức Project trên IFindFluent bạn nhận được từ Find.

Bạn có thể vượt qua một biểu thức lambda:

var result = await collection.Find(query).Project(hamster => hamster.Id).ToListAsync(); 

Hoặc sử dụng builder chiếu:

var result = await collection.Find(query) 
    .Project<Hamster>(Builders<Hamster>.Projection.Include(hamster => hamster.Id)) 
    .ToListAsync(); 

var result = await collection.Find(query) 
    .Project<Hamster>(Builders<Hamster>.Projection.Exclude(hamster => hamster.FirstName). 
     Exclude(hamster => hamster.LastName)) 
    .ToListAsync(); 
+0

Nhưng phương pháp Dự án chỉ lọc kết quả vào bộ nhớ. Toàn bộ tài liệu đang được lấy từ máy chủ, Điều này là xấu nếu tài liệu lớn. Phải có một số cuộc gọi API khác trong trình điều khiển C# làm cho truy vấn chỉ tìm nạp các trường cụ thể. –

+5

@YaronLevi No, 'Project' ** không ** chỉ lọc trong bộ nhớ. ** Đó là ** API chỉ tìm nạp các trường cụ thể. – i3arnon

+0

Phương pháp này yêu cầu lớp học phải được đăng ký (tức là 'BsonClassMap.RegisterClassMap ...')? – MoonKnight

1

Cập nhật Bạn có thể sử dụng một máy chiếu và FindAsync which returns a cursor and doesn't load all documents at once unlike Find. Bạn cũng có thể đặt thứ tự sắp xếp và giới hạn số tài liệu được trả lại.

var findOptions = new FindOptions<BsonDocument>(); 

    findOptions.Projection = "{'_id': 1}"; 

    // Other options 
    findOptions.Sort = Builders<BsonDocument>.Sort.Ascending("name");   
    findOptions.Limit = int.MaxValue; 

    var collection = context.MongoDatabase.GetCollection<BsonDocument>("yourcollection"); 

    using (var cursor = collection.FindSync("{name : 'Bob'}", options)) 
    { 
     while (cursor.MoveNext()) 
     { 
      var batch = cursor.Current; 
      foreach (BsonDocument document in batch) 
      { 
       // do stuff... 
      } 
     } 
    } 
Các vấn đề liên quan