2011-12-09 36 views

Respuesta

39

Actualización: Con la nueva versión del controlador (1.6 +) puede evitar los nombres de campo difíciles de codificación y utilizar LINQ lugar:

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

Puede hacerlo a través de SetFields método del cursor mongodb:

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

Por defecto SetFileds incluyen campos especificados. Si necesita excluir ciertos campos que se pueden utilizar:

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

O puede usar juntos:

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

A partir de v2.0 del conductor hay una nueva API asíncrono solamente. La antigua API ya no se debe usar ya que es una fachada de bloqueo sobre la nueva API y está en desuso.

La forma actualmente recomendada para incluir o excluir a ciertos miembros es utilizar el método Project en el IFindFluent que obtiene de Find.

Puede pasar una expresión lambda:

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

O utilice el constructor de proyección:

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

Pero el método Project solo filtra el resultado en la memoria. Se está recuperando todo el documento del servidor. Esto es malo si el documento es grande. Debe haber alguna otra llamada API en el controlador C# que hace que la consulta obtenga solo campos específicos. –

+5

@YaronLevi No, 'Project' ** no ** solo filtra en la memoria. ** Es ** la API que obtiene solo campos específicos. – i3arnon

+0

¿Requiere este método que la clase se registre (es decir, 'BsonClassMap.RegisterClassMap ...')? – MoonKnight

1

actualización Se puede usar una proyección y FindAsync which returns a cursor and doesn't load all documents at once unlike Find. También puede establecer un orden de clasificación y un límite para la cantidad de documentos devueltos.

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