2013-04-06 9 views
6

Zum Beispiel, was wäre, wenn ich Benutzername als eindeutige ID meines Mongo-Dokuments anstelle von Standard "_id" haben möchte?MongoDB: Wie setze ich ein anderes Feld (anders als _id) als ID des Mongo-Dokuments?

Ich möchte dies mit mongo.exe Konsole erreichen.

+2

Wenn sich Benutzernamen immer ändern könnten und sie in anderen Dokumenten verwendet werden, empfehle ich, sie nicht zum Primärschlüssel ('_id') zu machen, da Sie alle Orte aktualisieren müssen, die auf den neuen Benutzernamen zeigen (und Sie werden ein Timing-Problem haben, da in MongoDB keine Transaktionen vorhanden sind). – WiredPrairie

Antwort

14

MongoDB benötigt die _id-Eigenschaft als eindeutigen Primärschlüssel, der automatisch indiziert wird.

Sie haben zwei Möglichkeiten:

  1. die _id Eigenschaft verwenden und es mit dem Benutzernamen gesetzt.
  2. Erstellen Sie eine username-Eigenschaft und fügen Sie dann einen Index für diese neue Eigenschaft hinzu. Sie haben immer noch die _id, können aber den Benutzernamen verwenden.
+1

Ich weiß, dass es möglich ist, einen solchen Datensatz wie {Benutzername: "John", Alter: 12} zu haben. Ich meine, ohne _id. Wie macht man das? – Andrei

+2

Warum möchten Sie die _id entfernen? – cirrus

+3

Wenn Sie den Benutzernamen-Index definieren, können Sie verlangen, dass dieser eindeutig ist, wenn Sie das tun. _id ist klein und hilfreich. Lass es einfach in Ruhe und ignoriere es, bis du Mongodb viel besser verstehst. – Leopd

0

Ich weiß, dass es möglich ist, solche Aufzeichnung zu haben, wie {username: "John", Alter: 12}. Ich meine, ohne _id. Wie macht man das?

Ich bin mir nicht sicher, wie @Serges Antwort war nicht klar genug jedoch, um es erneut zu wiederholen, gibt es keine Möglichkeit. Technisch gesehen können Sie die _id in einigen Versionen von MongoDB jedoch trotzdem in einer Capped-Sammlung entfernen, andere dagegen nicht.

Auch ich bin besorgt über Ihre Verwendung von Benutzernamen, es könnte nicht die beste Sache für Aktivitäten wie Sharding und könnte "Hotspots" von hoher Aktivität auf Clustern usw. erstellen, es ist alles theoretisch, da ich nicht in Ihrer Position bin mit Ihren Daten ist es jedoch am besten, diese Dinge zu berücksichtigen.

+0

Dank für die Antworten, aber ich möchte nur wissen, wie es möglich ist. Lassen Sie mich einige weitere Einzelheiten nennen. Ich benutze .NET-Treiber und ich kann wie folgt codieren: Klasse Benutzer { [BsonId] öffentliche Zeichenfolge Benutzername {get; einstellen; } public string Passwort {get; einstellen; } } Wenn ich Objekt einer solchen Klasse in Mongodb setzen, bekomme ich Objekt ohne _id, und ich bin neugierig zu wissen, wie Treiber dieses Objekt interpretieren. Wie sieht die Operation aus? – Andrei

+0

@AndreiMikhalevich Warten Sie: "Wenn ich ein Objekt einer solchen Klasse in mongodb lege, bekomme ich ein Objekt ohne _id", was meinst du? Willst du sagen, dass du ein Objekt mit _id speicherst und es keine _id in der Datenbank gibt? Das sollte unmöglich sein. – Sammaye

+0

@AndreiMikhalevich: Wenn Sie ein Objekt ohne '_id' einfügen, wird der C# -Treiber einen für Sie erzeugen.Die '_id' ist ein erforderlicher Primärschlüssel für ein MongoDB-Dokument; Sie können Ihre eigenen Bezeichner verwenden oder den Standard [ObjectID] (http://docs.mongodb.org/manual/reference/object-id/) verwenden. – Stennie

1

_id ist wichtig in Replikation. Sie können eine Sammlung ohne einen _id Index erstellen, aber Sie werden nie in der Lage sein, die Datenbank zu replizieren. Die Replikation benötigt den Index _id für jede Sammlung.

Verwandte Themen