2012-04-09 25 views
8

Estoy tratando de ordenar una colección llamada user_score usando la clave position y obtengo el primer documento del resultado. En este caso, la colección user_score no existe y esperaba obtener el resultado como None, pero estaba recuperando el cursor.pymongo sort and find_one issue

1. resultado =

db.user_score.find({'score':'$lt':score}}).sort("position,pymongo.DESCENDING").limit(1) 

Ahora he cambiado de consulta, como a continuación y no recibió nada como se esperaba.

2. resultado =

db.user_score.find_one({'score':{'$lt':score}}, sort=[("position", pymongo.DESCENDING)]) 

Cuál es el problema con mi primera consulta?

Gracias

Respuesta

2

Este es el comportamiento predeterminado de mongodb en find. Siempre que use find obtendrá una lista del resultado (en este caso, un cursor iterable). Solo findOne - o su equivalente en PyMongo find_one devolverá None si la consulta no tiene coincidencias.

9

En su primera consulta, en la función de ordenamiento está pasando un argumento ("position,pymongo.DESCENDING"), cuando debe pasar dos argumentos ("position", pymongo.DESCENDING).

Asegúrese de tener en cuenta sus comillas.

-1

uso lista para convertir el valor del cursor en un diccionario:

list(db.user_score.find({'score':'$lt':score}}).sort("position",pymongo.DESCENDING).limit(1))[0]

+0

Esta fue la forma en que lo resolví también. find_one no toma .sort, pero find() lo hace, por lo que ordenar, limitar y obtener el primer elemento de la lista fue el camino a seguir – pojda

0

Un poco tarde en mi respuesta, pero parece que la versión actual de PyMongo soporta una operación sort en una llamada find_one .

Desde la página de documentación here (por favor grep la sección de find_one):

Todos los argumentos de encontrar() también son argumentos válidos para find_one(), aunque se ignorará cualquier argumento límite. Devuelve un solo documento , o Ninguno si no se encuentra un documento coincidente.

Ejemplo de uso es el siguiente:

filterdict = {'email' : '[email protected]'} 
collection.find_one(filterdict, sort=[('lastseen', 1)]) 

Esperanza esto ayuda a los buscadores más recientes!