Frage

Ich versuche, bestellte Wörterbücher in Pymongo zu bekommen.Ich habe gelesen, dass es mit bson gemacht werden kann.Sohn.Sohn.Die Dokumente sind Hier

Ich kann es jedoch anscheinend nicht zum Laufen bringen.Bei Google gibt es nicht viel darüber.Es gibt einige Diskussionen über die Konfiguration von Pymongo, um es anzuweisen, SON-Objekte zu verwenden, aber keine Beispiele.Ein Freund schlug vor, einen Parameter zu übergeben, wenn Sie einen Fund machen.Er konnte sich nicht erinnern.

Ich kann die SON-Objekte erstellen.Aber wenn sie in die Datenbank eingefügt werden und dann wieder herauskommen, sind sie einfach nur Diktate.

Ich bin mir nicht sicher, welches Codebeispiel ich Ihnen geben soll, weil ich wirklich nicht weiß, wo ich anfangen soll.Das folgende Snippet erstellt jedes Mal, wenn ich einen neuen Benutzer hinzufüge, ein leeres SON-Objekt.Das Objekt 'sub_users' wurde ebenfalls mit SON erstellt.Wenn ich das Kontodokument aus der Datenbank zurücklese, sind es nur normale Python-Diktate.

    account['sub_users'][sub_user_name] = bson.SON()
    with mongo_manager.Collection(CFG.db, 'Users') as users:
        users.save(account)

Vielleicht ein Parameter vorbei, um den Fund so zu konfigurieren?Das war der Vorschlag meines Freundes, aber er konnte sich nicht erinnern.

with mongo_manager.Collection(CFG.db, 'Users') as users:                                 
    account = users.find_one({'_id': _id, 'DOC':'OrderedDict})

Irgendwelche Ideen?

War es hilfreich?

Lösung

Sie können den generationspflichtigen Diktat von bson.son.SON oder generationsporticetagcode verwenden, um den bestellten DICT zu speichern.

und lehre Daten mit OrderedDict-Option.

Hier ist ein Beispiel:

generasacodicetagpre.

Ausgang:

generasacodicetagpre.

Andere Tipps

Diese obige Lösung ist für ältere Versionen von MongoDB und den Pymongo-Treiber korrekt, funktioniert jedoch nicht mehr mit pymongo3 und MongoDB3 +, die Sie jetzt hinzufügen müssen document_class=OrderedDict an den MongoClient-Konstruktor.Ändern der obigen Antwort für die Pymongo3-Kompatibilität.

from collections import OrderedDict
from pymongo import MongoClient
import bson

client = MongoClient(document_class=OrderedDict)
sample_db = client['sample']
test_col = sample_db['test']

test_col.drop()

data = OrderedDict([("one", 1), ("two", 2), ("three", 3), ("four", 4)])
test_col.insert(data)
print(list(test_col.find({}, {'_id': 0})))

test_col.drop()

data = bson.son.SON([("one", 1), ("two", 2), ("three", 3), ("four", 4)])
test_col.insert(data)
print(list(test_col.find({}, {'_id': 0})))

Ausgabe:

[OrderedDict([(u'one', 1), (u'two', 2), (u'three', 3), (u'four', 4)])]
[OrderedDict([(u'one', 1), (u'two', 2), (u'three', 3), (u'four', 4)])]

a standard find () in pymongo wird ein Objekt nicht zurückgeben, wer Felder in derselben Reihenfolge wie dieses Objekt in derselben Reihenfolge gibt, wenn Sie ihn über MONGO-Shell abgerufen haben.

Dies liegt daran, dass der zurückgegebene Standardtyp ein Diktat ist und die Bestellung nicht definiert ist.

Sie können Sohn wie vorgeschlagen verwenden.Hier ist, wie ich es getan habe. Nun wird die Feldreihenfolge respektiert.

Dies ist für PYMONGO== 3.4.0

generasacodicetagpre.

In PyMongo v3.2 insert() ist veraltet und sollte in diesem Beispiel durch ersetzt werden insert_one().Aktualisierter Code ist unten:

from collections import OrderedDict
from pymongo import MongoClient
import bson

client = MongoClient(document_class=OrderedDict)
sample_db = client['sample']
test_col = sample_db['test']

test_col.drop()

data = OrderedDict([("one", 1), ("two", 2), ("three", 3), ("four", 4)])
test_col.insert_one(data)
print(list(test_col.find({}, {'_id': 0})))

test_col.drop()

data = bson.son.SON([("one", 1), ("two", 2), ("three", 3), ("four", 4)])
test_col.insert_one(data)
print(list(test_col.find({}, {'_id': 0})))

Ausgabe:

[OrderedDict([(u'one', 1), (u'two', 2), (u'three', 3), (u'four', 4)])]
[OrderedDict([(u'one', 1), (u'two', 2), (u'three', 3), (u'four', 4)])]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top