2017-01-28 1 views
1

Ich versuche herauszufinden, wie Mongoose und MongoDB funktioniert ... Ich bin wirklich neu für sie, und ich kann nicht scheinen, wie man Werte basierend auf einem zurückgibt find-Anweisung, bei der einige der angegebenen Parameter in der Abfrage null sind - gibt es ein Attribut, das ich für dieses oder etwas festlegen kann?Eine find() - Anweisung mit möglichen Nullparametern

Um es weiter zu erklären, habe ich eine Webseite, die verschiedene Eingabefelder hat, die verwendet werden, um nach einer Firma zu suchen, aber sie sind nicht alle obligatorisch.

var Company = mongoose.model('Company'); 
    Company.find({companyName: req.query.companyName, position: req.query.position, 
        areaOfExpertise: req.query.areaOfExpertise, zip: req.query.zip, 
        country: req.query.country}, function(err, docs) { 
        res.json(docs); 
        }); 

von auf der Webseite alle Eingabefelder ausfüllen ich ein Ergebnis zurück, aber das spezifische nur die übereinstimmt. Nehmen wir an, ich fülle nur country aus, es gibt nichts zurück, weil der Rest leer ist, aber ich möchte alle Zeilen zurückgeben, die z.B. in Deutschland. Ich hoffe, ich habe mich deutlich genug ausgedrückt.

Antwort

1

Sie müssen die Abfragen mit dem $or logischen Operator wickeln, zum Beispiel

var Company = mongoose.model('Company'); 
Company.find(
    { 
     "$or": [ 
      { "companyName": req.query.companyName }, 
      { "position": req.query.position }, 
      { "areaOfExpertise": req.query.areaOfExpertise }, 
      { "zip": req.query.zip }, 
      { "country": req.query.country } 
     ] 
    }, function(err, docs) { 
     res.json(docs); 
    } 
); 

Ein anderer Ansatz wäre, eine Abfrage zu erstellen, die für leere Parameter überprüft, ob sie dann nicht null sind Fügen Sie es als Teil der Abfrage ein. Zum Beispiel können Sie die req.query Objekt als Ihre Abfrage verwenden, nur vorausgesetzt, die Tasten sind die gleichen wie Ihr Dokument Feld, wie in der folgenden:

/* 

the req.query object will only have two parameters/keys e.g. 
req.query = { 
    position: "Developer", 
    country: "France" 
} 
*/ 
var Company = mongoose.model('Company'); 
Company.find(req.query, function(err, docs) { 
    if (err) throw err; 
    res.json(docs); 
}); 

In der oben die req.query Objekt wirkt als die Abfrage und hat eine implizite logische AND Operation seit MongoDB bietet eine implizite AND Operation beim Angeben einer durch Komma getrennten Liste von Ausdrücken. Die Verwendung eines expliziten UND mit dem Operator $and ist erforderlich, wenn dasselbe Feld oder Operator in mehreren Ausdrücken angegeben werden muss.


Wenn Sie nach einer Abfrage, die erfüllt sowohl logische AND und OR dh alle Dokumente, die die Bedingungen beider Klauseln zum Beispiel gegeben eine Abfrage für position UND country oder jede andere Felder übereinstimmen, dann können Sie die Abfrage zwicken zu:

var Company = mongoose.model('Company'); 
Company.find(
    { 
     "$or": [ 
      { "companyName": req.query.companyName }, 
      { 
       "position": req.query.position, 
       "country": req.query.country 
      }, 
      { "areaOfExpertise": req.query.areaOfExpertise }, 
      { "zip": req.query.zip } 

     ] 
    }, function(err, docs) { 
     res.json(docs); 
    } 
); 

aber dann wieder zu diesem Thema, in welchem ​​Abfrageparameter müssen als obligatorisch werden usw.

+0

Ich werde es ausprobieren. Vielen Dank. – Rasmus

+0

Vielen Dank, aber ich muss eine andere Lösung finden, denn wenn ich nach "UI-Entwickler" und "Frankreich" suche, gibt es alle UI-Entwickler in allen Ländern und allen Positionen in Frankreich. – Rasmus

+0

Möglicherweise müssen Sie die obige Abfrage so optimieren, dass bestimmte Abfrageklauseln ein logisches UND erfüllen, d. H. Alle Dokumente zurückgeben, die den Bedingungen beider Klauseln entsprechen. – chridam

0

verbunden sein könnte ich einfach die par landete Löschen Verbessert die Abfrage, falls sie leer sind. Es scheint, dass alle Textfelder im Submit als "" (leer) übergeben werden. Da solche Werte in der Datenbank nicht vorhanden sind, würde nichts zurückgegeben. So einfach es nie fiel mir ein ...

Beispiel:

if (req.query.companyName == "") { 
     delete req.query.companyName; 
} 
Verwandte Themen