A pergunta e resposta acima são bastante antigas. De qualquer forma, se alguém visitar isso, sinto que devo acrescentar:
Esta resposta está completamente errada. Na verdade, nos Documentos do Mongo SÃO pares de valores-chave ordenados. No entanto, ao usar pymongo, ele usará python dicts para documentos que de fato não são ordenados (a partir do cpython 3.6 python dicts mantêm a ordem, no entanto, isso é considerado um detalhe de implementação). Mas esta é uma limitação do driver pymongo.
Esteja ciente de que essa limitação realmente afeta a usabilidade. Se você consultar o banco de dados para um subdocumento, ele só corresponderá se a ordem dos pares de valores-chave estiver correta.
Tente você mesmo o seguinte código:
from pymongo import MongoClient
db = MongoClient().testdb
col = db.testcol
subdoc = {
'field1': 1,
'field2': 2,
'filed3': 3
}
document = {
'subdoc': subdoc
}
col.insert_one(document)
print(col.find({'subdoc': subdoc}).count())
Cada vez que esse código é executado, o 'mesmo' documento é adicionado à coleção. Assim, cada vez que executamos este trecho de código, o valor impresso 'deveria' aumentar em um. Ele não encontra apenas subdocumentos de maches com a ordenação correta, mas os dicts de python apenas inserem o subdoc em ordem arbitrária.
veja a seguinte resposta como usar dict ordenado para superar isso:https://stackoverflow.com/a/30787769/4273834