¿Cómo consultar resultados distintos en mongodb con python?

Tengo una colección de Mongo con varios documentos, supongo que lo siguiente (suponga que Tom tuvo dos maestros para Historia en 2012 por cualquier razón)

{ "name" : "Tom" "year" : 2012 "class" : "History" "Teacher" : "Forester" } { "name" : "Tom" "year" : 2011 "class" : "Math" "Teacher" : "Sumpra" } { "name" : "Tom", "year" : 2012, "class" : "History", "Teacher" : "Reiser" } 

Quiero poder consultar todas las clases distintas que “Tom” ha tenido, a pesar de que Tom ha tenido varias clases de “Historia” con varios maestros, solo quiero que la consulta obtenga la cantidad mínima de documentos, de manera que Tom esté en todos ellos y “Historial” aparecen una vez, en lugar de tener un resultado de consulta que contiene varios documentos con “Historial” repetido.

Eché un vistazo a: http://mongoengine-odm.readthedocs.org/en/latest/guide/querying.html

y querer poder probar algo como:

 student_users = Students.objects(name = "Tom", class = "some way to say distinct?") 

Aunque no parece estar documentado. Si esta no es la forma sintácticamente correcta de hacerlo, ¿es posible en mongoengine o hay alguna forma de lograrlo con alguna otra biblioteca como pymongo? ¿O tengo que consultar todos los documentos con Tom y luego realizar un procesamiento posterior para obtener valores únicos? La syntax sería apreciada para cualquier caso.

En primer lugar, solo es posible obtener valores distintos en algún campo (solo un campo) como se explica en la documentación de MongoDB en Distinct .

La clase QuerySet de QuerySet admite el método distinct () para realizar el trabajo.

Así que puedes intentar algo como esto para obtener resultados:

 Students.objects(name="Tom").distinct(field="class") 

Esta consulta da como resultado un documento BSON que contiene una lista de clases a las que Tom asiste.

Atención Tenga en cuenta que el valor devuelto es un solo documento, por lo tanto, si supera el tamaño máximo del documento (16 MB), obtendrá un error y, en ese caso, tendrá que cambiar al método de mapeo / reducción para resolver este tipo de problemas.

 import pymongo posts = pymongo.MongoClient('localhost', 27017)['db']['colection'] res = posts.find({ "geography": { "$regex": '/europe/', "$options": 'i'}}).distinct('geography') print type(res) res.sort() for line in res: print line 

consulte http://docs.mongodb.org/manual/reference/method/db.collection.distinct/ distinct devuelve una lista, se imprimirá en el tipo de impresión (res), puede ordenar una lista con res.sort () , después de eso se imprimirá los valores de la lista ordenada.

También puede consultar publicaciones antes de seleccionar valores distintos.

 student_users = Students.objects(name = "Tom").distinct('class')