2016-09-07 1 views
0

S'il vous plaît, j'essaie de comprendre comment interroger dynamiquement une collection. J'ai une collection qui a le schéma ci-dessous. J'ai créé une interface utilisateur dans laquelle un utilisateur peut interroger les données en utilisant n'importe quelle combinaison des champs disponibles. Un utilisateur peut faire une requête en recherchant une propriété en utilisant le champ sale_lease, amount.amount et également interroger le champ general_features qui est un tableau. Je ne sais pas comment générer cette requête en fonction de la préférence sélectionnée par l'utilisateur. Je sais comment effectuer la requête en connaissant les champs interrogés avant la main, mais la rendre dynamique est l'endroit où se trouve le problème.Comment structurer une requête MongoDb dynamique

J'essaie d'utiliser plusieurs instructions if pour éventuellement faire une requête pour toutes les combinaisons possibles de champs, mais je me rends compte que ce n'est pas le moyen d'y parvenir. Je serai très reconnaissant si je peux être indiqué dans la bonne direction.

+0

Non, ça ne vous plait pas, pouvez-vous nous en parler? Merci –

+0

Désolé, mal lu la question – chridam

+0

Voir https://stackoverflow.com/questions/31995166/mongoose-optional-search-query-parameters – JohnnyHK

Répondre

0

Prenons le cas simple où votre collection a plusieurs clés, l'utilisateur peut interroger sur n'importe quelle combinaison d'entre eux, et vous voulez ET les résultats. Un modèle typique serait:

let query = {}' 
if ($("#type").length) query.type = $("#type").val(); 
if ($("#sale_lease").length) query.sale_lease = $("#sale_lease").val(); 
if ($("#state").length) query.location = { state: $("#state").val() }; 
return Tripart_Property.find(query); 

Pour simplifier, ci-dessus suppose que vous avez donné chaque champ de recherche un ID égal au champ de schéma correspondant. Votre convention de nommage peut varier.

Comme vous pouvez le voir, vous commencez avec un objet de requête vide puis examinez chaque champ de recherche, s'il n'est pas vide, puis ajoutez une clé à la requête correspondant à la clé de schéma que vous souhaitez rechercher. Avec de bonnes conventions de dénomination et une structure de champ simple, vous pouvez même le faire dans une boucle js de sorte que vous n'avez pas besoin d'une instruction if par clé.

+0

Merci @ Michel Floyd votre suggestion fonctionne mais j'ai un peu de mal à chercher une clé dont la valeur est un objet. Comme en utilisant mon schéma location.state. S'il vous plaît pouvez-vous mettre à jour votre réponse pour refléter cela afin que je puisse l'accepter comme réponse. –

0

Sans connaître les détails de la façon dont les utilisateurs peuvent effectuer une sélection pour la requête, le nom de la collection, etc., il est difficile de fournir un exemple détaillé; Cependant, vous devriez être en mesure de prendre la sélection de l'utilisateur et de le transformer en un objet de paramètre de requête. Par exemple, en supposant que le nom de la collection est Tripart_Property, si l'utilisateur effectue une sélection pour le champ sale_lease, vous pouvez effectuer les opérations suivantes:

var saleLeaseSelection = argumentContainingSelectionFromUser; 
var customQuery = { sale_lease: saleLeaseSelection }; 
Tripart_Property.find(customQuery); 

Ceci est un exemple très basique. argumentContainingSelectionFromUser est la donnée de la sélection de l'utilisateur. Vous voudriez probablement construire une méthode sur le serveur que vous pourriez appeler du client qui retournerait les résultats de la requête afin que vous puissiez les afficher à l'utilisateur, mais cela devrait au moins vous faire pointer dans la bonne direction.