Erzwingen eines eindeutigen eingebetteten Dokuments in Mongoid

9

Ich habe das folgende Modell

%Vor%

Wie kann ich Folgendes sicherstellen?

%Vor%

d. Aufgabennamen sind innerhalb einer bestimmten Person eindeutig

Nachdem ich die Dokumente zu den Indizes ausgecheckt habe, dachte ich, dass das Folgende funktionieren könnte:

%Vor%

aber

%Vor%

erzeugt immer noch ein Duplikat.

Die oben in Person angezeigte Index-Konfiguration würde in mongodb übersetzt werden

%Vor%     
opsb 02.12.2010, 19:03
quelle

7 Antworten

1

Indizes sind standardmäßig nicht eindeutig. Wenn Sie sich die Mongo Docs ansehen, ist die Eindeutigkeit eine zusätzliche Markierung.

Ich kenne die exakte Mongoid-Übersetzung nicht, aber Sie suchen nach etwas wie diesem:

db.things.ensureIndex({firstname : 1}, {unique : true, dropDups : true})

    
Gates VP 02.12.2010, 20:26
quelle
4

Können Sie nicht einfach einen Validator auf die Aufgabe setzen?

%Vor%

Dies sollte die Eindeutigkeit innerhalb des übergeordneten Dokuments sicherstellen.

    
Paul Elliott 01.03.2011 13:39
quelle
0

Ich glaube nicht, dass dies mit eingebetteten Dokumenten möglich ist. Ich stieß auf dasselbe Problem wie Sie und die einzige Problemumgehung, die ich fand, war, ein referenziertes Dokument anstelle eines eingebetteten Dokuments zu verwenden und dann einen zusammengesetzten Index für das referenzierte Dokument zu erstellen.

Offensichtlich ist eine Eindeutigkeitsprüfung nicht genug, da sie nicht vor den Rennbedingungen schützt. Ein anderes Problem, dem ich bei eindeutigen Indizes gegenüberstand, war, dass das Standardverhalten von Mongoid darin besteht, keine Fehler zu erzeugen, wenn die Validierung besteht und die Datenbank das Dokument nicht akzeptiert. Ich musste die folgende Konfigurationsoption in mongoid.yml ändern:

%Vor%

Dies ist dokumentiert unter Ссылка

Nach der Änderung werden die Methoden zum Speichern / Erstellen einen Fehler auslösen, wenn die Datenbank das Speichern des Dokuments verweigert. Sie brauchen also etwas, um den Benutzern mitteilen zu können, was passiert ist:

%Vor%

Auch das ist nicht wirklich eine gute Option, weil Sie raten müssen, welche Felder den Fehler verursacht haben (und warum). Eine bessere Lösung wäre es, in MongoidError nachzusehen und entsprechend eine entsprechende Fehlermeldung zu erzeugen. Das obige war für meine Bewerbung geeignet, also ging ich nicht so weit.

    
Andy Agrawal 09.11.2011 01:12
quelle
0

Fügen Sie eine Validierungsprüfung hinzu, indem Sie die Anzahl der IDs des Arrays von eingebetteten Tasks mit denen eines anderen Arrays mit eindeutigen IDs vergleichen.

%Vor%

Arbeitete für mich.

    
Gurpartap Singh 06.12.2011 10:53
quelle
0

Sie können eine validates_uniqueness_of in Ihrem Task-Modell definieren, um sicherzustellen, dass diese Validierung entsprechend der Mongoid-Dokumentation in Ссылка gilt in den Umfang des übergeordneten Dokuments und sollte tun, was Sie wollen.

Ihre Index-Technik sollte auch funktionieren, aber Sie müssen die Indizes generieren, bevor sie in Kraft treten. Mit Rails können Sie dies mit einer Rake-Aufgabe tun (in der aktuellen Version von Mongoid heißt sie db: mongoid: create_indexes). Beachten Sie, dass beim Speichern von Objekten, die gegen die Indexeinschränkung verstoßen, keine Fehler auftreten, da Mongoid (weitere Informationen finden Sie unter Ссылка ) ).

    
mkrmr 12.03.2012 06:19
quelle
0

Sie können den Index auch in Ihrer Modellklasse angeben:

%Vor%

und verwende die Rake-Aufgabe

%Vor%     
Leopd 20.03.2013 20:06
quelle
-1

Sie müssen ausführen:

%Vor%

direkt in der Datenbank

Sie scheinen einen "create index command" in Ihren "active record" aufzunehmen (d. h. class Person)

    
BenG 08.12.2011 00:42
quelle