La domanda e la risposta di cui sopra sono piuttosto vecchie. Comunque, se qualcuno visita questo mi sento come se dovessi aggiungere:
Questa risposta è completamente sbagliata. In realtà in Mongo Documents SONO ordinate coppie chiave-valore. Tuttavia, quando si utilizza pymongo, utilizzerà python dicts per documenti che in effetti non sono ordinati (a partire da cpython 3.6 python dicts mantiene l'ordine, tuttavia questo è considerato un dettaglio di implementazione). Ma questa è una limitazione del driver pymongo.
Tieni presente che questa limitazione influisce effettivamente sull'usabilità. Se interroghi il db per un documento secondario, questo corrisponderà solo se l'ordine delle coppie chiave-valore è corretto.
Prova tu stesso il codice seguente:
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())
Ogni volta che questo codice viene eseguito, lo "stesso" documento viene aggiunto alla raccolta. Pertanto, ogni volta che eseguiamo questo frammento di codice, il valore stampato "dovrebbe" aumentare di uno. Non perché trova solo maches subdocuemnts con l'ordine corretto, ma python dicts inserisce semplicemente il subdoc in ordine arbitrario.
vedere la seguente risposta su come utilizzare il dict ordinato per superare questo problema:https://stackoverflow.com/a/30787769/4273834