2015-04-06 17 views
9

Ich versuche, eine Suche aus Eingabe von einem Formular erhalten.Programmgesteuert erstellen dynamische Abfrage mit Mongoose

router.get('/data', function(req, res) { 
    var firstName=req.body.firstName, 
    lastName=req.body.lastName, 
    companyName=req.body.companyName, 
    email=req.body.email; 
}); 

Ich möchte eine Abfrage erstellen aus diesen Werten, aber wenn das Feld keinen Wert hat, möchte ich natürlich nicht in die Suche einbezogen werden (Suche nach „“ würde die Ergebnisse ändern)

ich habe ein paar verschiedene Dinge ausprobiert, wie eine Zeichenfolge Gebäude in platzieren:

mongoose.model('customers').find({QUERY STRING WOULD GO HERE} ,function(err, data) { 
    if (err) return console.error(err); 
    console.log(data); 
}); 

Aber das scheint nicht richtig zu funktionieren. Ich habe auch versucht „stacking“ Suchanfragen wie folgt aus:

if(firstName !="") { 
    mongoose.model('customers').find({firstName: firstName}) 
} 

und dann die Suche wie folgt ausführen:

mongoose.model('customers').exec(function(err, customer){ 
    console.log(customer); 
}); 

Aber das verursacht 500 Fehler (und ich bin nicht sicher, ob es mehr Infos Ich kann von ihnen bekommen).

Bitte helfen ein Neuling dynamisch eine Mungo Suchabfrage bauen :(

+0

Statt einer Abfrage-String, haben Sie versucht, eine Abfrage Objekts? (Wenn Sie neu bei Javascript sind, nennen Sie es "Hash" oder "Map" oder "Array") – slebetman

+0

@slebetman Sie haben absolut Recht. Ich habe nachgeschaut, wie man ein Objekt erstellt, aber ich habe es einfach nicht richtig gemacht :( –

Antwort

16

Versuch zu schaffen query Objekt, wie:.

//generate query object based on availability of value 
var query = {}; 
if(your_variable !== "") { 
    query["some_key"] = your_variable; 
} 
if(your_second_variable !== "") { 
    query["some_other_key"] = your_second_variable; 
} 
mongoose.model('customers').find(query, function(err, c) { 
    //do something 
}); 
+0

Ich habe genau das gemacht und es hat funktioniert! Ich habe versucht, ein Objekt die ganze Zeit falsch zu machen! Danke, dass du mir geholfen hast! –

+0

Funktioniert perfekt! – user3344977

+0

Hi DemoUser, Wenn ich die 'in' Kontrolle wie das obige verwenden möchte, bedeutet dies, dass ich dies überprüfen möchte {usernames: {$ in: ['x', 'y', 'z']}}. In diesem Fall was ist die erste Variable und die zweite Variable – RamBen

2

Um zu vermeiden, jeden Parameter Überprüfung unabhängig Sie können Schleife durch sie

var query = {}; 
for(var key in req.body){ //could also be req.query and req.params 
    req.body[key] !== "" ? query[key] = req.body[key] : null; 
} 

mongoose.model('customers').find(query, function(err, customers){ 

}) 
+0

Das ist sehr hilfreich, danke! Ich habe das an ein paar anderen Orten in meiner App getan und es war sehr hilfreich! –

2

Für Leute, die neueren JavaScript verwenden (und besonders auf Node.js 7.6.0+ oder Babel).

Der beste Weg, den ich für das programmatische Erstellen von Abfragen gefunden habe (basierend auf if Klauseln usw.), verwendet die Abfrage und die alternative Syntax.

let query = PersonModel().find(); 

if (isMale) { 
    query.where('sex', 'male'); 
} else { 
    query.where('sex', 'female'); 
} 

query.where('alive', true); 

// and then to run the query 
const result = await query.exec(); 

Notiere die async/await Nutzung hier. Es funktioniert perfekt auf Node.js 7.6.0+. Wenn Sie nicht async/await wollen verwenden, können Sie nur Promises verwenden wie so:

query.exec().then(result => { 
    // result has your... results 
}); 
+0

Danke für die Eingabe! Mein Anwendungsfall ist viel einfacher als das, aber ich schätze es so oder so! Ich bin sicher, dass jemand es gut nutzen wird! –