Estou tentando usar o recurso de classificação ao consultar meu mongoDB, mas está falhando. A mesma consulta funciona no console do MongoDB, mas não aqui. O código é o seguinte:
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
O erro que recebo é o seguinte:
Traceback (most recent call last):
File "find_ow.py", line 7, in <module>
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
Encontrei um link em outro lugar que diz que preciso colocar um 'u' na frente da chave se estiver usando o pymongo, mas isso também não funcionou. Qualquer outra pessoa faz isso funcionar ou é um bug.
.sort([("field1",pymongo.ASCENDING), ("field2",pymongo.DESCENDING)])
para classificar vários campos.Você pode tentar isso:
fonte
Isso também funciona:
Estou usando isso no meu código, por favor, comente se estou fazendo algo errado aqui, obrigado.
fonte
ASCENDING
eDESCENDING
depymongo
. :)Por que python usa a lista de tuplas em vez de ditar?
No python, você não pode garantir que o dicionário seja interpretado na ordem que você declarou.
Portanto, no mongo shell você pode fazer
.sort({'field1':1,'field2':1})
e o intérprete deve classificar o campo1 no primeiro nível e o campo 2 no segundo nível.Se essa sintaxe foi usada em python, há uma chance de classificar o field2 no primeiro nível. Com tupla, não há risco.
fonte
Python usa chave, direção. Você pode usar o caminho acima.
Então, no seu caso, você pode fazer isso
fonte
TLDR: o pipeline de agregação é mais rápido em comparação com o convencional
.find().sort()
.Agora vamos para a explicação real. Há duas maneiras de executar operações de classificação no MongoDB:
.find()
e.sort()
.Conforme sugerido por muitos .find (). Sort () é a maneira mais simples de realizar a classificação.
No entanto, esse é um processo lento comparado ao pipeline de agregação.
Chegando ao método de agregação de pipeline. As etapas para implementar o pipeline de agregação simples destinado à classificação são:
NOTA: Na minha experiência, o pipeline de agregação funciona um pouco mais rápido que o
.find().sort()
método.Aqui está um exemplo do pipeline de agregação.
Tente você mesmo esse método, compare a velocidade e deixe-me saber sobre isso nos comentários.
Editar: Não se esqueça de usar
allowDiskUse=True
ao classificar em vários campos, caso contrário, ocorrerá um erro.fonte
Digamos que você queira classificar por campo 'created_on', para fazer assim,
fonte