Erstens ist dies eher eine Entwurfsfrage als eine Programmierfrage.
Ich erstelle eine Anwendung, in der ich vorhandene JSON-Daten abrufen und in MongoDB einfügen muss. Ich habe festgestellt, dass einige der JSON-Dokumente einen Punkt .
in ihrem Schlüssel haben. Ich habe in der MongoDB-Dokumentation gelesen, dass .
Punkte in MongoDB nicht als Schlüssel zulässig sind, da sie zum Abfragen verwendet werden.
Ich mache nicht viele Einfügungen in die Webanwendungen, es ist so ziemlich eine einmalige Einfügung. Außerdem würde ich meistens das gesamte Dokument abrufen, anstatt Teile davon abzufragen, da ich alle Daten abrufen muss.
In Anbetracht meiner Anforderungen habe ich zwei Möglichkeiten, wie das JSON-Dokument gespeichert werden soll:
- Durchsuchen Sie den JSON nach einem Punkt in den Schlüsseln, maskieren Sie diese und fügen Sie sie in MongoDB ein.
- Konvertieren Sie den gesamten JSON in das BSON-Format und speichern Sie ihn als solchen, sodass kein Escape-Vorgang erforderlich ist. Analysieren Sie den JSON bei Bedarf außerhalb von MongoDB manuell
Könnten Sie mir sagen, welches Design besser wäre, da ich nicht zu einem Schluss kommen kann?
Antworten:
Es gibt einige Alternativen:
1. Ersetzen Sie die Punkte durch einen Bindestrich.
Dies wäre mein Lieblingsansatz, da dadurch die Struktur explizit genug bleibt.
Da es Ihrer Meinung nach „so ziemlich eine einmalige Einfügung ist“, sollte es relativ einfach sein, zu überprüfen, ob nichts kaputt geht (dh es gibt bereits denselben Schlüssel mit einem Bindestrich). In anderen Situationen erfordert das programmgesteuerte Durchführen dieser Überprüfungen das Schreiben von Code, ist jedoch immer noch eine relativ einfache Aufgabe.
2. Ersetzen Sie Punkte durch ein Unicode-Punktzeichen wie U + FF0E .
Ich würde dringend von diesem Ansatz abraten, da dies zu massiven Debugging-Kopfschmerzen führen würde . Es ist eine gute Möglichkeit, jemanden, der den resultierenden JSON irgendwo im Code weit weg von MongoDB verwendet, zu erraten, dass ein Punkt nicht wirklich ein Punkt ist, buchstäblich Wochen der Zeit eines anderen zu verschwenden. Behalten Sie solche Unicode-Tricks für die Hacker, die jemanden dazu verleiten wollen, zu glauben, dass ein Charakter ein anderer ist.
3. Verwenden Sie BSON.
Da Sie behaupten, dass Sie "meistens das gesamte Dokument abrufen würden, anstatt Teile davon abzufragen", hat dieser Ansatz in Ihrem Fall keine wesentlichen Nachteile . Obwohl Sie "meistens" gesagt haben, bedeutet dies, dass Sie manchmal nur Teile des Dokuments abrufen.
Im Allgemeinen besteht der Nachteil darin, dass Sie das Dokument nicht durchsuchen oder nur einen Teil davon laden können.
4. Verwenden Sie eine Standardcodierung, z. B. Base64.
Das Konvertieren der problematischen Schlüssel (oder aller Schlüssel, abhängig vom Verhältnis zwischen problematischen und unproblematischen) in Base64 oder Hexadezimal könnte eine praktikable Lösung sein, mit dem Vorteil, dass sie ziemlich explizit sind: Die meisten Entwickler würden Base64- oder Hexadezimalwerte auf einen Blick erkennen .
Der Nachteil ist der erhöhte Speicherbedarf sowie die Notwendigkeit, die Schlüssel bei ihrer Verwendung zu codieren und zu decodieren.
5. Stellen Sie
check_keys
auffalse
.Ich würde dringend von diesem Ansatz abraten, da dies die Datenabfrage mehrdeutig machen und Stunden oder Tage damit verschwenden würde, herauszufinden, warum eine bestimmte Abfrage nicht das tut, was Sie sich vorgestellt haben. Punkt ist ein reservierter Charakter und der Scheck ist hier, um Sie zu schützen; Wenn Sie MongoDB anweisen, die Prüfung zu überspringen, verschieben Sie nur den Moment, in dem Sie sich mit einem Konflikt zwischen der Syntax von MongoDB und dem in einem Schlüssel verwendeten reservierten Zeichen befassen müssen.
quelle
Verwenden Sie einfach BSON. Dann haben Sie ein gut dokumentiertes Format mit gut getesteter Bibliotheksunterstützung, und vor allem können Sie es ohne Verlust invertieren (codieren / decodieren).
quelle