2012-07-19 16 views
11

Ich entwickle dieses Stück Software in Knoten und MongoDB, in dem ich möchte im Wesentlichen mit der folgenden Struktur Versionen von Paketen speichern:Wie gehe ich mit Punkten in MongoDB-Schlüsseln um?

{ 
    "versions": 
    { 
     "1.2.3": { stuff } 
    } 
} 

(ähnlich, wie npm tut Dinge in der Couch)

Das Problem ist, dass bei der Aktualisierung von MongoDB festgestellt wurde, dass Punkte in Schlüsselnamen (aufgrund der vorhandenen Punktnotation) nicht zulässig sind, wodurch mein Code fehlschlägt. Nach der Untersuchung, alles, was ich finden konnte, ist, dass Sie die Punkte in ein anderes Zeichen vor dem Speichern in der db transformieren müssen, dann transformieren Sie sie wieder beim Zugriff. Gibt es wirklich keinen besseren Weg, damit umzugehen?

Wenn nicht, wie kann ich diese Umwandlung tun, ohne die Daten auf einen anderen Schlüssel zu kopieren und das Original zu löschen?

+0

Sie sagen, Sie haben bereits solche Daten in Mongo? Das hätte nicht einmal vor dem Update möglich sein sollen. Welche Version hast du benutzt? – Thilo

+0

@Thilo Ich erinnere mich nicht wirklich, aber es könnte der Fahrer gewesen sein, der fehlerhaft war und es erlaubte. – jli

+0

@ c0deNinja Es erlaubt mir, nach dem Versionsnamen zu suchen, ohne das ganze Array von möglicherweise sehr vielen Versionen zu durchlaufen. – jli

Antwort

2

Dot Einschränkungen sind derzeit Treiber erzwungen, und nicht alle Fahrer haben Punkte in Feldnamen seit Anfang verhindert. Sie können rohen Protokollcode schreiben, um alle möglichen verrückten Sachen in Mongo zu machen, einschließlich der Verwendung wirklich komischer Charaktere in Sammlungsnamen.

Sie werden viel besser dran sein, wenn Sie das aufräumen (wahrscheinlich ersetzen Punkte mit - oder einem anderen gültigen Zeichen), aber es wird schwierig sein, es gut mit jeder Art von intelligenter Filterung zu tun. Wahrscheinlich müssen Sie die gesamte Sammlung durchlaufen, die Werte in Ihrer App verschieben und dann das gesamte Feld "Versionen" in Ihrem Dokument überschreiben. In Place überschreibt dies sollte relativ schnell sein, da sie nicht die Größe des Dokuments ändern und wahrscheinlich keine Indizes ändern wird.

+0

Ja, das ist, was ich dachte .. ein Problem hier ist, dass Benutzer dieser Anwendung jede Zeichenfolge als eine Version hinzufügen können, so dass ich keinen Standard haben, mit zu arbeiten. Würde die Geschwindigkeit, die sich aus der Durchführung dieser Operationen bei jedem einzelnen Lesevorgang ergibt, den Leistungsvorteil von Mongo im Vergleich zu etwas wie einer Couch aufwiegen? Ich kann nur Datenbanken wechseln, da das Projekt gerade in einer sehr frühen Entwicklungsphase ist. – jli

+0

Eigentlich scheint es, dass es beim Testen relativ schnell sein wird, danke. – jli

+0

Benötigen Sie tatsächlich Abfrage in den Versionen des Dokuments? Sie könnten tatsächlich eine JSON-Zeichenkette in "Versionen" speichern und sie einfach zur Lade-/Ansichtszeit von Hand auslesen. String-Verarbeitung bei Lesevorgängen wird wahrscheinlich nicht viel verlangsamen, lesen Geschwindigkeit in Mongo ist viel schneller als Couch. – MrKurt

3

Können Sie eine Sammlung von Versionen mit Zeug verwenden?

Like:

{ 
    "versions": 
    [ 
       { 
        "version_num": "1.2.3", 
        "stuff": { stuff } 
       }, 
       { 
        "version_num": "1.2.4", 
        "stuff": { stuff } 
       } 
    ] 
} 
+0

Nun abgesehen davon, dass ein ungültiges Objekt, ich ' m versuchen zu vermeiden, hier über ein Array iterieren zu müssen. – jli

+0

Ja, es ist ungültig, frage mich nur, ob ein Array funktionieren würde. Okey – keaplogik

Verwandte Themen