Per farlo funzionare, è necessario aggiungere un po' di logica condizionale in più quando un valore viene passato tramite { $in: value }
. Poiché gli errori che si stavano verificando erano dovuti a problemi di formattazione con { $in: value }
, la chiave era assicurarsi che questo venisse attivato solo quando c'è un valore da passare.
Quindi, alla fine, per farlo funzionare - senza dover passare un array di tutti i valori possibili, che non era una soluzione elegante né performante - ho cambiato questo:
private processType(name: string, value: any, body)
{
if (this.body[name] && !value) {
delete this.body[name];
} else {
this.body[name] = { $in: value };
}
}
... a questo:
private processType(name: string, value: any, body)
{
if (this.body[name] && !value || this.body[name] && value.length < 1) {
delete this.body[name];
} else if (value) {
this.body[name] = { $in: value };
}
}
Ciò che fa essenzialmente è garantire che un array di almeno un valore sia disponibile quando viene attivato { $in:value }.
L'unica altra modifica necessaria era quella che riguarda ciò che viene emesso quando un utente ha deselezionato tutti i valori. L'ho gestito in questo modo:
private sendLangSelections(languageFilterOptions) {
const origLangArray = ['English', 'Spanish', 'Mandarin'];
if (languageFilterOptions)
{
let selectionsArray = this.languageFilterOptions.selection;
let values = selectionsArray.map((a) => { return a.value; });
if (values && values.length > 0)
{
this.sendLanguage.emit(values);
}
else if (values && values.length < 1)
{
this.sendLanguage.emit(this.obj = undefined);
}
}
}