2013-04-10 20 views
19

für mein Projekt, möchte ich für Gruppen von Organisationen ein Mungo Dokument halten, wie folgt aus:Mongoose Einzigartige Werte in verschachtelten Array von Objekten

var groupSchema = Schema({ 
    name : { type : String }, 
    org : { type : Schema.Types.ObjectId, ref : 'Organization' }, 
    ... 
    users : [{ 
    uid : { type : Schema.Types.ObjectId, ref : 'User' }, 
    ... 
    }] 
}); 

ich aus den gleichen Benutzer verhindern möchten, dass in der gleichen Gruppe sein zweimal. Dazu muss ich erzwingen, dass users.uid im Benutzerarray eindeutig ist. Ich habe versucht, "unique: true" für uid anzugeben, aber das hat nicht funktioniert. Gibt es eine Möglichkeit, dies mit Mungo oder MongoDB ohne zusätzliche Abfragen oder Teilen des Schemas zu tun?

Edit: änderte ich den vorherigen Wert von uid zu uid: {type: Schema.Types.ObjectId, ref: 'User', Index: {einzigartig: true, dropDups: true}} Aber dies noch doesn Es scheint nicht zu funktionieren.

Edit: Angenommen, es gibt keine einfache Möglichkeit, dies zu erreichen, habe ich eine zusätzliche Abfrage hinzugefügt, die überprüft, ob der Benutzer bereits in der Gruppe ist. Dies scheint mir der einfachste Weg zu sein.

+0

überprüfen Sie dies wird es [hilfreich] (http://stackoverflow.com/questions/12395118/mongodb-setting-unique-field) – karthick

+0

Vielen Dank für den Link. Ich habe folgendes versucht: uid: {type: Schema.Types.ObjectId, ref: 'Benutzer', index: {unique: true, dropDups: true}} anstelle des alten Wertes für uid. Das funktioniert immer noch nicht, ich habe auch versucht, mongoDB ohne Erfolg neu zu starten. –

Antwort

61

Ein eindeutiger Index für ein Arrayfeld erzwingt, dass derselbe Wert nicht in den Arrays von mehr als einem Dokument in der Auflistung angezeigt wird, verhindert jedoch nicht, dass derselbe Wert mehrmals im Array eines einzelnen Dokuments erscheint . Sie müssen also die Eindeutigkeit sicherstellen, wenn Sie stattdessen Elemente zum Array hinzufügen.

Verwenden Sie den Operator $addToSet, um nur dann einen Wert zu einem Array hinzuzufügen, wenn der Wert nicht bereits vorhanden ist.

Group.update({name: 'admin'}, {$addToSet: {users: userOid}}, ... 

Wenn jedoch die users Array Objekte mit mehreren Eigenschaften enthält, und Sie wollen Einzigartigkeit nur einer von ihnen, um sicherzustellen, über (uid in diesem Fall), dann müssen Sie einen anderen Ansatz:

var user = { uid: userOid, ... }; 
Group.update(
    {name: 'admin', 'users.uid': {$ne: user.uid}}, 
    {$push: {users: user}}, 
    function(err, numAffected) { ... }); 

Das bedeutet, dass die Aktualisierung $push nur dann erfolgt, wenn user.uid nicht bereits im Feld uid eines der Elemente von users vorhanden ist. So imitiert es $addToSet Verhalten, aber nur für uid.

+0

Aber wie kann man nur UID zwingen, einzigartig zu sein? Im Benutzer-Array habe ich mehr Attribute, die jedes Mal anders sein können, wenn ich denselben Benutzer hinzufüge (wie Datum). –

+0

Vielen Dank für Ihre Eingabe. Ich habe über Validatoren gelesen, aber ich sehe keinen einfacheren Weg, als eine zusätzliche Abfrage hinzuzufügen, um zu überprüfen, ob der Benutzer bereits in der Gruppe ist. –

+0

@GuidoPassage Ich habe eine Möglichkeit hinzugefügt, Ihren spezifischen Anwendungsfall zu unterstützen. – JohnnyHK

Verwandte Themen