2011-12-09 9 views

Odpowiedz

39

Aktualizacja: z nową wersją sterowników (1.6 +) można uniknąć nazwy pól sztywnego kodowania i używać LINQ zamiast:

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

Można to zrobić poprzez SetFields metody MongoDB kursora:

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

Według defaul SetFileds zawierają określone pola. Jeśli trzeba wykluczyć niektóre pola można użyć:

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

Albo można ich używać razem:

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

Począwszy od wersji 2.0 sterownika nowe asynchroniczne tylko API. Stary interfejs API nie powinien już być używany jako blokująca fasada nowego interfejsu API i jest przestarzały.

Obecnie zalecanym sposobem dodawania lub wykluczania niektórych członków jest użycie metody Project na IFindFluent, którą można uzyskać od Find.

Można też przekazać wyrażenie lambda:

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

Albo użyć konstruktora projekcji:

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

Ale metoda projektu filtruje tylko wynik w pamięci. Cały dokument jest pobierany z serwera, jest to złe, jeśli dokument jest duży. W sterowniku C# musi być inne wywołanie API, które powoduje, że zapytanie pobiera tylko określone pola. –

+5

@YaronLevi Nie, 'Projekt' ** nie ** filtruje tylko w pamięci. ** To jest interfejs API, który pobiera tylko określone pola. – i3arnon

+0

Czy metoda ta wymaga zarejestrowania klasy (np. 'BsonClassMap.RegisterClassMap ...')? – MoonKnight

1

Aktualizacja Można użyć projekcji i FindAsync which returns a cursor and doesn't load all documents at once unlike Find. Można również ustawić porządek sortowania i limit liczby zwracanych dokumentów.

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... 
      } 
     } 
    }