40 Stimmen

MongoDB: Eindeutiger Index für die Eigenschaft eines Array-Elements

Ich habe eine ähnliche Struktur wie diese:

class Cat {
  int id;
  List<Kitten> kittens;
}

class Kitten {
  int id;
}

Ich möchte verhindern, dass Benutzer eine Katze mit mehr als einem Kätzchen mit der gleichen Kennung anlegen können. Ich habe versucht, einen Index wie folgt zu erstellen:

db.Cats.ensureIndex({'id': 1, 'kittens.id': 1}, {unique:true})

Aber wenn ich versuche, eine schlecht formatierte Katze einzufügen, akzeptiert Mongo sie.

Übersehe ich etwas? Kann das überhaupt gemacht werden?

-1voto

David J Punkte 915

In diesem Fall können Sie eine eigene Mongoose-Validierungsmethode schreiben. Sie können sich in die Post-Validierung einklinken. Mongoose hat eine Validierung und Sie können einen Hook vor (pre) oder nach (post) der Validierung implementieren. In diesem Fall können Sie die Postvalidierung verwenden um zu sehen ob das Array gültig ist. Stellen Sie dann einfach sicher, dass das Array keine Duplikate enthält. Möglicherweise können Sie die Effizienz auf der Grundlage Ihrer Angaben verbessern. Wenn Sie z. B. nur '_id' haben, können Sie einfach die Funktion JS includes verwenden.

catSchema.post('validate',function(next) {
    return new Promise((resolve,reject) => {
        for(var i = 0; i < this.kittens.length; i++) {
           let kitten = this.kittens[i];
           for(var p = 0; p < this.kittens.length; p++) {
              if (p == i) {
                  continue;
              }
              if (kitten._id == this.kittens[p]._id) {
                  return reject('Duplicate Kitten Ids not allowed');
              }
           }
        }
        return resolve();
    });
});

Ich verwende gerne Versprechen bei der Validierung, weil es einfacher ist, Fehler anzugeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X