Kann ich die Verwendung von String als ID Typ für mongodb-Dokument?
Ich bin mit java/morphia Umgang mit mongodb. Die Standard-ObjectId ist nicht sehr praktisch für die Verwendung von Java-Schicht. Ich würde es gern machen, ein String-Typ, während halten Sie die Schlüssel-Generierung mit ObjectId, sagen _id = new ObjectId.toString()
.
Möchte ich wissen, ob es irgendwelche Nebenwirkungen dadurch? Zum Beispiel, wird es Auswirkungen auf die performance der Datenbank oder verursacht wichtigsten Konflikte, mit welchen Mitteln? Wird es Auswirkungen auf die Splitter-Umgebung ...
- Können Sie erklären, mehr über, warum die ObjectId ist unbequem? Sie können ganz einfach erstellen man aus einem string wie
id= new ObjectId(str)
- String ist der Typ in jedem Java-Programm, während die ObjectId ist nicht. Ich will nicht die Einführung einer neuen Art zu anderen Komponenten, die mit "meine Bibliothek". wahrscheinlich wird es erfordern, morphia, mongodb und bson-Bibliothek importiert werden, es ist immer noch besser, wenn die Leute über meine Bibliothek ist transparent zu mongodb-Typen einschließlich ObjectId
- Hmm... aber wenn Ihre Bibliothek die Speicherung von Daten in Mongo, nicht die mongo.jar müssen in den classpath überhaupt? Auch, es ist ein Aufwand die Erstellung und Müll sammeln mit vielen Streichern.
- Wenn Sie möchten, um einen neuen string-Wert für "ID", verwenden Sie
(new ObjectId).valueOf()
statt(new ObjectId).toString()
(geändert in MongoDB ver 2.2).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie können jede Art von Wert für eine
_id
Feld (außer für Arrays). Wenn Sie sich entscheiden nicht zu verwenden, ObjectId, müssen Sie irgendwie garantieren die Einmaligkeit der Werte (Gießen ObjectId string wird nicht). Wenn Sie versuchen, legen Sie doppelten Schlüssel, Fehler auftreten, und Sie müssen mit ihm umgehen.Ich bin mir nicht sicher, welchen Effekt wird es haben auf sharded cluster, wenn Sie versuchen, fügen Sie zwei Dokumente mit dem gleichen _id auf verschiedenen shards. Ich vermute, es wird lassen Sie Sie einfügen, aber diese wird dich beißen später. (Ich ' ll haben, dies zu testen).
Sagte, Sie sollten keine Probleme haben, sich mit
_id = (new ObjectId).toString()
._id
s halten kann Wert vom Typarray
.(new ObjectId).valueOf()
statt(new ObjectId).toString()
(geändert in MongoDB ver 2.2).Eigentlich wollte ich die gleiche Sache, weil ich hatte einige problem die Umwandlung der ObjectId zu JSON.
Ich habe Sie dann so etwas wie
Und alles hat gut funktioniert, bis ich beschloss, aktualisieren Sie eine zuvor eingefügte Dokument, wenn ich die Objekt-Id gesendet, auf der Seite über JSON und erhalten die gleiche aktualisierte Objekt auch durch JSON-post und dann auf den "speichern" - Funktion aus dem Datastore, anstatt die Aktualisierung der bisherigen Daten eingefügt, ein neues Dokument, anstatt die Aktualisierung bereits.
Sogar am schlechtesten das neue Dokument hatte die gleiche ID als die zuvor eingesetzten, was ich dachte, war unmöglich.
Ich eh eingestellt das private-Objekt, wie eine ObjectID und Links nur die get-set als string und dann funktionierte es wie erwartet, nicht sicher, das hilft in deinen Fall gedacht.
Ja, Sie können einen string als Ihre _id.
Ich würde ihn nur empfehlen, wenn Sie einen Wert (in dem Dokument), das ist natürlich eine gute eindeutiger Schlüssel. Ich habe dieses design in einer Kollektion, wo es eine Reihe von geo-Tags der form "xxxxyyyy"; diese einzigartige-pro-Dokument-Feld gehen zu MÜSSEN, werden in das Dokument und ich hatte zum erstellen eines index drauf... also warum nicht verwenden es als Schlüssel? (Dies vermieden eine zusätzliche Schlüssel-Wert-paar, UND vermieden einen zweiten index auf die Sammlung, die seit MondoDB natürlich baut einen index auf "_id". Angesichts der Größe der Sammlung, diese beiden addiert, um einige ernsthafte Einsparung von Speicherplatz.)
Jedoch aus dem Ton Ihrer Frage ("ObjectIDs sind nicht sehr bequem"), wenn der einzige Grund, den Sie verwenden möchten, eine Zeichenfolge ist, die Sie nicht wollen, um mit belästigt werden, herauszufinden, wie man ordentlich verwalten ObjectIDs... ich würde vorschlagen, es ist Wert Ihre Zeit, um Ihren Kopf herum. Ich bin sicher, Sie werden keine Probleme... sobald Sie herausgefunden haben, Ihre Probleme mit Ihnen.
Ansonsten: was sind Ihre Optionen? Sie werden zusammenbrauen string-IDs JEDES MAL, wenn Sie eine MongoDB in der Zukunft?
Möchte ich hinzufügen, dass es nicht immer eine gute Idee, verwenden Sie die automatisch generierten BSON ObjectID, die als eindeutiger Bezeichner, wenn es an die Anwendung übergeben: es kann potenziell manipuliert werden durch den Benutzer.
ObjectIDs angezeigt werden sequenziell generiert, so dass, wenn Sie nicht zur Umsetzung der notwendigen Autorisierungs-Mechanismen, böswilliger Benutzer könnte einfach erhöhen Sie den Wert er hat, um auf die Ressourcen zugreifen, sollte er nicht haben Zugang zu.
Daher kann die Verwendung von UUID-Typ-IDS wird eine Schicht des security-through-obscurity. Natürlich Zulassung (ist dieser Benutzer zulässig Zugriff auf angeforderte Ressource) ist ein muss, aber Sie sollten sich bewusst sein, von den vorgenannten ObjectID Funktion.
Erhalten das beste aus beiden Welten, erzeugen UUID, die passt zu Ihrem ObjectID Länge (12 oder 24 Zeichen) und es verwenden, um erstellen Sie Ihr eigenes _id des ObjectID-Typ.