2012-05-02 15 views
5

Con Spring-Data, puede usar la anotación @Document para especificar a qué colección guardar el objeto. Digamos que tengo dos clases, Estudiante y Profesor, ambas persistieron en la colección de personas. Cuando ejecuto el siguiente código:Spring-Data mongodb consulta de varias clases almacenadas en la misma colección

mongo.find(new Query(), Teacher.class); 

el resultado contiene tanto estudiantes como profesores. Al mirar los datos creados por Spring-Data, cada documento contiene un campo "_class" que indica de qué clase se conserva.

Este campo no se usa en buscar como filtro para devolver solo a Profesor? ¿Cómo busco solo para Profesor que no sea esto?

mongo.find(new Query().addCriteria(where("_class").is(Teacher.class.getCanonicalName()), Teacher.class); 

Respuesta

1

Esto es más o menos una cuestión de cómo diseñar sus colecciones. Como Mongo no sabe nada sobre los tipos, debemos agregar los metadatos adicionales para poder distinguir los documentos entre sí. Por lo tanto, al realizar consultas, deberá agregar estas restricciones a la consulta también. Tenga en cuenta que puede consultar la clave _class a través del DefaultMongoTypeMapper.DEFAULT_TYPE_KEY.

Hemos pensado en añadir un poco de API para la consulta de expresar sólo se quiere obtener documentos de un tipo determinado de esta manera:

mongo.find(new Query(Teacher.class), Teacher.class); 

todavía se siente un poco raro que usted tiene a la clase de dominio estado dos veces (lo cual tiene sentido si quiere restringir los resultados a documentos de un tipo dado pero asignarlos a una clase diferente). Más allá de eso, solo podíamos restringir los resultados a documentos que llevan exactamente ese tipo ya que los tipos se almacenan como cadenas y la herencia solo se puede aplicar si la clase ya se ha cargado. Por lo tanto, al consultar documentos con el tipo Person, primero debemos cargar todos los documentos, intentar buscar el tipo, hacer la verificación de tipo y posiblemente descartar el resultado que es subóptimo por razones de rendimiento.

Otra opción sería almacenar todos los tipos a los que se puede asignar una clase (prácticamente todas las interfaces y superclases excepto Object) pero eso causaría una gran cantidad de datos almacenados. Esto podría ser abordado agregando una bandera a la anotación @Document.

Conclusión: actualmente, no hay otra manera, pero siéntanse libres de aumentar las entradas de Jira si tiene alguna sugerencia de cómo se puede mejorar.

+0

Gracias Oliver, levantaré un billete si se me ocurre una buena solución. – ltfishie

+0

Pasando por el mongodb Jira, me encontré con este ticket https://jira.springsource.org/browse/DATAMONGO-128 que es un mercado tan fijo como el de 1.0.M3. ¿Esto todavía está en la fuente? – ltfishie

+0

Sí, pero esto no está tocando su escenario. El boleto cubre la posibilidad de almacenar 'Persona' y' Profesor' dentro de la misma colección y poder consultar objetos desde él y obtener 'Person' y 'Teacher' instanciados (de ahí la información de tipo necesaria). En realidad, no considera mejorar el escenario "solo leer' Objetos del profesor ". –

1

esta es la mejor solución para esta pregunta:

query.restrict(Teacher.class,Teacher.class); 
+3

Proporcionar más detalles sobre la respuesta sugerida sería de gran ayuda para el OP – Hawk

+0

Perfecto, gracias. –

Cuestiones relacionadas