MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Une façon plus élégante de gérer les valeurs de filtrage dans l'application angulaire

Pour que cela fonctionne, il s'agit d'ajouter un peu plus de logique conditionnelle au moment où une valeur est transmise via { $in: value } . Étant donné que les erreurs qui apparaissaient étaient dues à des problèmes de formatage avec { $in: value } , la clé était de s'assurer que cela n'est déclenché que lorsqu'il y a une valeur à transmettre.

Donc, au final, pour que cela fonctionne - sans avoir à passer un tableau de toutes les valeurs possibles, ce qui n'était pas une solution élégante ni performante - j'ai changé ceci :

private processType(name: string, value: any, body)
{
    if (this.body[name] && !value) {
            delete this.body[name];
        } else {
            this.body[name] = { $in: value };
        }
}

... à ceci :

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 };
        }
}

Cela garantit essentiellement qu'un tableau d'au moins une valeur est disponible lorsque le { $in:value } est déclenché.

Le seul autre changement nécessaire était celui impliquant ce qui est émis lorsqu'un utilisateur a désélectionné toutes les valeurs. J'ai géré cela, de cette façon :

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);
                }
        }
}