Cómo ordenar mongodb con pymongo

Estoy intentando usar la función de clasificación al consultar mi mongoDB, pero está fallando. La misma consulta funciona en la consola MongoDB pero no aquí. El código es el siguiente:

import pymongo from pymongo import Connection connection = Connection() db = connection.myDB print db.posts.count() for post in db.posts.find({}, {'entities.user_mentions.screen_name':1}).sort({u'entities.user_mentions.screen_name':1}): print post 

El error que recibo es el siguiente:

 Traceback (most recent call last): File "find_ow.py", line 7, in  for post in db.posts.find({}, {'entities.user_mentions.screen_name':1}).sort({'entities.user_mentions.screen_name':1},1): File "/Library/Python/2.6/site-packages/pymongo-2.0.1-py2.6-macosx-10.6-universal.egg/pymongo/cursor.py", line 430, in sort File "/Library/Python/2.6/site-packages/pymongo-2.0.1-py2.6-macosx-10.6-universal.egg/pymongo/helpers.py", line 67, in _index_document TypeError: first item in each key pair must be a string 

Encontré un enlace en otra parte que dice que debo colocar una ‘u’ delante de la clave si utilizo pymongo, pero tampoco funcionó. Alguien más consigue que esto funcione o es un error.

.sort() , en pymongo, toma la key y la direction como parámetros.

Así que si quieres ordenar por, digamos, id entonces deberías .sort("_id", 1)

Para campos múltiples:

 .sort([("field1", pymongo.ASCENDING), ("field2", pymongo.DESCENDING)]) 

Puedes probar esto:

 db.Account.find().sort("UserName") db.Account.find().sort("UserName",pymongo.ASCENDING) db.Account.find().sort("UserName",pymongo.DESCENDING) 

Esto también funciona:

 db.Account.find().sort('UserName', -1) db.Account.find().sort('UserName', 1) 

Estoy usando esto en mi código, por favor comente si estoy haciendo algo mal aquí, gracias.

¿Por qué Python usa la lista de tuplas en lugar de dict?

En Python no puede garantizar que el diccionario se interpretará en el orden declarado.

Entonces, en mongo shell podría hacer .sort({'field1':1,'field2':1}) y el intérprete debería clasificar field1 en el primer nivel y field 2 en el segundo nivel.

Si esta syntax se usó en python, existe la posibilidad de ordenar field2 en el primer nivel. Con la tupla no hay riesgo.

 .sort([("field1",pymongo.ASCENDING), ("field2",pymongo.DESCENDING)]) 
 .sort([("field1",pymongo.ASCENDING), ("field2",pymongo.DESCENDING)]) 

Python usa clave, dirección. Puede utilizar el camino anterior.

Así que en tu caso puedes hacer esto.

 for post in db.posts.find().sort('entities.user_mentions.screen_name',pymongo.ASCENDING): print post