2012-09-18 21 views
6

estoy usando conductor Morphia Java para consultar una MongoDB que contiene una colección de la siguiente forma:consultas MongoDB para distintos valores ordenados

MyCollection { 
    TypeA 
    TypeB 
} 

Quiero recuperar todos los valores distintos de Tipo B, que yo utilizando el siguiente código:

DBCollection myCol = getDatastore().getCollection(MyCollection.class); 
List typeBs = myCol.distinct("TypeB"); 

El código anterior funciona como se esperaba, pero la lista de valores distintos no está ordenada.

he experimentado con el siguiente código:

DBCollection myCol = getDatastore().getCollection(MyCollection.class); 
DBObject orderBy = new BasicDBObject("$orderby", new BasicDBObject("TypeB", 1); 
List typeBs = myCol.distinct("TypeB", orderBy); 

Pero en este caso, la lista está vacía, ¿dónde están mis suposiciones mal?

ACTUALIZACIÓN

Mediante el uso de la CLI descubrí que la siguiente consulta devuelve el resultado esperado:

> db.mycollection.find({$query : {}, $orderby : { TypeB : 1 }}) 

Así que ajustar mi código en consecuencia:

DBCollection myCol = getDatastore().getCollection(MyCollection.class); 

BasicDBObject ascending = new BasicDBObject("TypeB", 1); 
BasicDBObject filter = new BasicDBObject(); 
filter.put("$query", new BasicDBObject()); 
filter.put("$orderby", ascending); 

List typeBs = myCol.distinct("TypeB", filter); 

Aún resultado contiene 0 entradas!

Lo que realmente hace que me confunde es que la misma consulta funciona si uso .find en lugar de .distinct:

DBCollection myCol = getDatastore().getCollection(MyCollection.class); 

BasicDBObject ascending = new BasicDBObject("TypeB", 1); 
BasicDBObject filter = new BasicDBObject(); 
filter.put("$query", new BasicDBObject()); 
filter.put("$orderby", ascending); 

myCol.find(filter).hasNext(); <-- Evaluates to TRUE 

Por qué es que el filtro no funciona cuando se utiliza el distinta método- ¿llamada?

Respuesta

5

el segundo parámetro DBObject de DBCollection.distinct() es un objeto de consulta, utilizado para definir los criterios de coincidencia. Para ordenar los distintivos de lista, puede usar:

List typeBs = myCol.distinct("TypeB"); 
java.util.Collections.sort(typeBs); 
+2

Sí, esta es una solución que estoy usando actualmente. Pero creí que debería poder agregar una consulta que ordena el resultado antes de elegir los distintos valores. – aksamit

+2

¿Qué sucede si desea ordenar en el nivel mongodb, en caso de que esté haciendo límite – nightograph

Cuestiones relacionadas