2016-09-07 6 views
0

Bitte, ich versuche, meinen Kopf über das dynamische Abfragen einer Sammlung zu wickeln. Ich habe eine Sammlung, die das folgende Schema hat.So strukturieren Sie die dynamische MongoDb-Abfrage

Ich habe eine Benutzeroberfläche erstellt, wo ein Benutzer die Daten mit einer beliebigen Kombination der verfügbaren Felder abfragen kann. Ein Benutzer kann mithilfe des Felds sale_lease, amount.amount und mithilfe des Feldes general_features, das ein Array ist, eine Abfrage erstellen, um nach einer Eigenschaft zu suchen. Ich weiß nicht, wie ich diese Abfrage basierend auf der vom Benutzer gewählten Präferenz erzeuge. Ich weiß, wie man die Abfrage durchführt, wenn man weiß, welche Felder zuvor abgefragt wurden, aber es dynamisch zu machen ist, wo das Problem liegt.

Ich versuche, mehrere if Anweisungen zu verwenden, um möglicherweise eine Abfrage für alle möglichen Kombination von Feldern, aber ich stelle fest, dass dies nicht der Weg ist, dies zu erreichen. Ich werde sehr dankbar sein, wenn ich auf die richtige Richtung hingewiesen werden kann.

+0

Nein, bitte nicht, können Sie darauf Expatriate. Danke –

+0

Entschuldigung, die Frage wurde falsch gelesen – chridam

+0

Siehe https://StackOverflow.com/questions/31995166/mongoose-optional-search-query-parameters – JohnnyHK

Antwort

0

Nehmen wir den einfachen Fall, in dem Ihre Sammlung mehrere Schlüssel hat, der Benutzer kann eine beliebige Kombination von ihnen abfragen, und Sie möchten die Ergebnisse UND. Ein typisches Muster wäre:

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

Der Einfachheit halber nimmt die oben, dass Sie jedes Suchfeld gleich dem entsprechenden Schemafeld eine ID gegeben haben. Ihre Namenskonvention kann variieren.

Wie Sie sehen, beginnen Sie mit einem leeren Abfrageobjekt und sehen dann jedes Suchfeld an. Wenn es nicht leer ist, fügen Sie einen Schlüssel zu der Abfrage hinzu, die dem Schemaschlüssel entspricht, nach dem Sie suchen möchten.

Mit guten Namenskonventionen und einer einfachen Feldstruktur können Sie dies sogar in einer js-Schleife tun, so dass Sie keine if Anweisung pro Schlüssel benötigen.

+0

Dank @Michel Floyd Ihr Vorschlag funktioniert, aber ich habe ein wenig Probleme bei der Abfrage nach einem Schlüssel, dessen Wert ist ein Objekt. Wie die Verwendung meines Schemas location.state. Bitte können Sie Ihre Antwort aktualisieren, um das zu reflektieren, damit ich sie als Antwort akzeptieren kann. –

0

Ohne genau zu wissen, wie Benutzer eine Auswahl für die Abfrage, den Namen der Sammlung usw. treffen können, ist es schwierig, ein detailliertes Beispiel zu geben; Sie sollten jedoch in der Lage sein, die Auswahl des Benutzers zu übernehmen und sie in ein Abfrageparameterobjekt umzuwandeln. Tripart_Property Zum Beispiel ist die Kollektionsnamen angenommen, wenn der Benutzer eine Auswahl für das sale_lease Feld macht, können Sie Folgendes tun:

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

Dies ist ein sehr einfaches Beispiel. argumentContainingSelectionFromUser sind die Daten aus der Benutzerauswahl. Wahrscheinlich möchten Sie eine Methode auf dem Server erstellen, die Sie vom Client aus aufrufen können, die die Ergebnisse aus der Abfrage zurückgibt, sodass Sie sie dem Benutzer anzeigen können, aber dies sollte Sie zumindest in die richtige Richtung weisen.

Verwandte Themen