2016-10-11 2 views
3

Ich versuche, ein MongoDB-Abfrageobjekt basierend auf Daten zu erstellen, die von einem clientseitigen Suchformular empfangen werden. Mein Ziel ist es, die Datenbank mit allen vom Benutzer bereitgestellten Kriterien abzufragen, während der Benutzer einige Suchfelder leer lassen kann, wenn sie dies wünschen.Dynamische Abfrage MongoDB

Dies ist mein aktueller Versuch einer Abfrageobjekt ist:

var q = {}; // declare the query object 
    q['$and']=[]; // filter the search by any criteria given by the user 
    if((req.body.learninglanguages).length > 0){ // if the criteria has a value or values 
    q["$and"].push('{learningLanguages: {$in: ' + req.body.learninglanguages.split(",") + '}}'); // add to the query object 
    } 
    if((req.body.spokenlanguages).length > 0){ 
    q["$and"].push('{spokenLanguages: {$in: ' + req.body.spokenlanguages.split(",") + '}}'); 
    } 
    if((req.body.country).length > 0){ 
    q["$and"].push('{country: {$in: ' + req.body.country.split(",") + '}}'); 
    } 
    if((req.body.commethod).length > 0){ 
    q["$and"].push('{comMethod: {$in: ' + req.body.commethod.split(",") + '}}'); 
    } 

Aber das resultierende Objekt ist:

{ '$and': 
    [ '{learningLanguages: {$in: Albanian,American Sign Language,Amharic,Arabic,Arabic (Egyptian)}}', 
    '{spokenLanguages: {$in: Akan,Albanian,American Sign Language,Amharic}}', 
    '{country: {$in: Åland Islands}}', 
    '{comMethod: {$in: whatsapp,email,face to face,skype}}' ] } 

Wie kann ich richtig ein MongoDB $ in Abfrage von req.body Objekten baut ?

+0

Haben Sie die Dokumentation konsultiert? https://docs.mongodb.com/manual/reference/operator/query/in/ – Derek

+0

Ich habe, aber ich kann nichts hilfreiches zum dynamischen Erstellen von Abfrageobjekten finden. –

+0

Bitte überprüfen Sie meine Antwort unten und markieren Sie sie korrekt, wenn sie Ihren Anforderungen entspricht – Derek

Antwort

2

Das Problem mit Ihrer Anfrage ist ein String, anstatt direkt den Bau eines Objekts zu bauen versuchen, wie mongoDB & Mungo akzeptieren:

var q = {}; // declare the query object 
    q['$and']=[]; // filter the search by any criteria given by the user 
    if((req.body.learninglanguages).length > 0){ // if the criteria has a value or values 
    q["$and"].push({ learningLanguages: {$in: req.body.learninglanguages.split(",") }}); // add to the query object 
    } 
    if((req.body.spokenlanguages).length > 0){ 
    q["$and"].push({ spokenLanguages: {$in: req.body.spokenlanguages.split(",") }}); 
    } 
    if((req.body.country).length > 0){ 
    q["$and"].push({ country: {$in: req.body.country.split(",") }}); 
    } 
    if((req.body.commethod).length > 0){ 
    q["$and"].push({ comMethod: {$in: req.body.commethod.split(",") }}); 
    } 

Sie können sehen, dass stattdessen in einer Reihe von drängen, ich bin Stattdessen wird ein direktes Objekt eingefügt, das den Dokumentationsspezifikationen entspricht.

finden Sie in der Dokumentation hier für weitere Informationen:

  1. https://docs.mongodb.com/manual/reference/operator/query/and/
  2. https://docs.mongodb.com/manual/reference/operator/query/in/

Und hier ist ein jsbin arbeiten Sie mit spielen können:

  1. http://jsbin.com/cequbipiso/edit?js,console
+1

hat mir auch geholfen, danke – pkpk

1

Ich folgte Dereks Vorschlag, der in Bezug auf das dynamische Konstruieren der Abfragebedingungen genau ist. Es scheint jedoch, dass dieser Code kein Szenario behandelt, in dem keine Suchparameter angegeben sind.

Insbesondere, wenn alle req.body Parameter leer sind, dann haben Sie ein Abfrage-Objekt mit einem leeren $ und Array wie hier erklärt:

q['$and']=[]; 

Dies führt zu einem MongoError: $and/$or/$nor must be a nonempty array Fehler.

Hier ist, was ich tat, um dieses Problem zu beheben:

var conditions = {}; //declare a conditions object 
var and_clauses = []; //an array for the and conditions (and one for or conditions and so on) 

if((!!req.body.email_id)){ 
    and_clauses.push({ 'email_id': {$regex: req.body.email_id }}); 
} 

if(and_clauses.length > 0){ 
    conditions['$and'] = and_clauses; // filter the search by any criteria given by the user 
} 

//Run the query 
User.find(conditions, 
    function(err, users) { 
     if (err){ 
      console.log(err); 
      res.status(500).send(err); 
     }else{ 
      console.log(users); 
      res.status(200).json(users); 
     } 
}); 

Derek, Entschuldigungen, wenn ich etwas falsch verstanden, wollen nicht falsch ein Problem hinweisen.

+0

Hallo Vikas, danke für den zusätzlichen Schritt zu Derek Antwort. Das hat gut für mein Szenario funktioniert. – user752746