2011-08-21 12 views
12

Recientemente estaba jugando con el driver oficial de mongodb. El problema que he encontrado es cómo hacer una proyección de consulta. Ejemplo si tengo un objeto PERSISTEDProyección de consultas con el controlador MongoDB 10gen

class A{ 
    id 
    PropA 
    PropB 
    List<LargeObjects> 
} 

¿Cómo puedo recuperar sólo la identificación, propa y propB en lugar de recuperar la totalidad del objeto? ¿Cómo se puede hacer con el controlador oficial mongodb C#?

+1

Q.P está disponible a través de MongoCollection <>. Find(). SetFields (incluir/excluir); –

+0

setfields es, en mi opinión, no una proyección. Simplemente hace que el valor en el documento sea nulo, por lo que todavía tiene un "documento completo, solo con algunos valores nulos. –

Respuesta

0

Uso FindAs<>() con un tipo que incluye sólo los campos que desee. Ver docs.

Agregue el atributo [BsonIgnoreExtraElements] o el [BsonExtraElements] en esa clase. Ver docs.

+0

Básicamente resultó que SetField llamando a leer desde una colección es suficiente para hacer qp –

13

proyección de consulta está disponible a través de:

MongoCollection<>.Find().SetFields(include/exclude); 
2

Se puede utilizar el siguiente consulta LINQ para esto:

//NB: Not tested 
    MongoCollection<BsonDocument> Acollection = _db.database.GetCollection<BsonDocument>("A"); 
    var resultlist = (from k in Acollection.AsQueryable<A>() 
               select k.id,k.PropA,k.PropB); 

Más información sobre las consultas LINQ se puede encontrar aquí: http://www.mongodb.org/display/DOCS/CSharp+Driver+LINQ+Tutorial#CSharpDriverLINQTutorial-SupportedLINQqueryoperators

+0

No hubo implementación de LINQ entonces :) –

0

Usando el Mongo Profiler Pude determinar que a veces los resultados de Linq se proyectan en el cliente. Por lo tanto, depende de lo que su cliente necesita. Si desea devolver un documento resultante con datos parciales del servidor Mongo, querrá usar las respuestas de Marjan o Ian. De lo contrario, si desea leer el registro y proyectarlo a un tipo de datos diferente, utilice Linq.

5

A partir de la v1.8 del controlador 10gen MongoDB C# oficial (y como Zambonilli eludió en una respuesta anterior), el operador Seleccionar linq siempre se realizará en el lado del cliente, no en el servidor db.

Documentación (también proporcionado por Sunil Raj en una respuesta anterior): http://docs.mongodb.org/ecosystem/tutorial/use-linq-queries-with-csharp-driver/

Casi la mitad hacia abajo de la página, en la sección "Seleccionar" operador de consulta LINQ, es una gran caja roja que lee:

Advertencia: Seleccionar no genera menos campos devueltos por el servidor. Todo el documento se retira y se pasa al método Select nativo. Por lo tanto, la proyección se realiza desde el lado del cliente.

Cuestiones relacionadas