2012-12-24 9 views
6

Mam schemat User, który ma pole username. Chciałbym, aby w tym polu była rozróżniana wielkość liter, aby użytkownicy mogli rejestrować nazwy, takie jak BobDylan. Potrzebuję jednak mojego schematu do sprawdzania nowych wpisów, aby sprawdzić, czy nie ma duplikatów, które są wrażliwe, na przykład bobdylan.Programy pobierające/selektory mongozy do normalizowania danych

Moje badania nauczyły mnie, że powinienem stworzyć dodatkowe pole w schemacie przechowywania wersji małej/wielkiej litery, aby móc łatwo sprawdzić, czy jest ono unikatowe. Moje pytanie brzmi: jak mam to osiągnąć za pomocą interfejsu API Mongoose?

Próbowałem przy użyciu set funkcji, takich jak:

UserSchema.path('username_lower_case').set(function(username_lower_case) { 
    return this.username.toLowerCase() 
}); 

Jednak funkcja ta nie wydaje się być uruchomiony. Zasadniczo muszę powiedzieć username_lower_case, aby być czymkolwiek, co jest username, ale małymi literami.

Odpowiedz

10

Jednym ze sposobów byłoby użycie haczyka przed oszczędzaniem, aby to zrobić.

UserSchema.pre('save', function (next) { 
    this.username_lower_case = this.username && this.username.toLowerCase(); 
    next(); 
}); 

Innym sposobem byłoby zrobić username wirtualny:

UserSchema.virtual('username').set(function (value) { 
    this.username_raw = value; 
    this.username_lower_case = value && value.toLowerCase(); 
}).get(function() { 
    return this.username_raw; 
}); 
+0

Dzięki! Czy wstępne zapisywanie ma miejsce przed zatwierdzeniem? –

+1

Nie jestem pewien, ale myślę, że gdy wywołasz 'save', sprawdzanie poprawności uruchamia się przed hakami' pre-save'. Przynajmniej to ma największy sens. –