2016-10-11 4 views
3

クライアント側の検索フォームから受け取ったデータに基づいてMongoDBクエリオブジェクトを作成しようとしています。私の目標は、ユーザーが提供するすべての条件でデータベースを照会することですが、ユーザーが選択すると検索フィールドを空白のままにすることができます。動的クエリMongoDB

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(",") + '}}'); 
    } 

しかし、結果のオブジェクトは、次のとおりです:

これは、クエリオブジェクトでの私の現在の試みはあるさ

{ '$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}}' ] } 

私が正しくreq.bodyオブジェクトからのクエリでMongoDBの$を構築することができますどのように?

+0

ドキュメントを参照しましたか? – Derek

+0

私は持っていますが、クエリオブジェクトを動的に構築するのに役立つものは何も見つかりません。 –

+0

下記の私の答えをチェックし、それがあなたのニーズを満たしている場合はそれを正しくマークしてください – Derek

答えて

2

クエリに問題がMongoDBの&マングースが受け入れるようにあなたは、代わりにオブジェクトを直接構築する文字列を構築しようとしている次のとおりです。

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(",") }}); 
    } 

代わりに、文字列を押し込むと、私はあることがわかります代わりにドキュメントの仕様に合った直接オブジェクトをプッシュします。

詳細情報はこちらのドキュメントを参照してください:

  1. http://jsbin.com/cequbipiso/edit?js,console
    1. https://docs.mongodb.com/manual/reference/operator/query/and/
    2. https://docs.mongodb.com/manual/reference/operator/query/in/

    そして、ここでは作業jsbinあなたがで遊ぶことができます3210

+1

もお手伝いしました。 – pkpk

1

私はDerekの提案に従いました.Derekの提案は動的にクエリ条件を構成する方法の点であります。しかし、このコードは、検索パラメータが指定されていないシナリオを処理していないようです。

すべてreq.bodyのパラメータが空の場合はここで宣言として具体的に、あなたは空$、配列を使用してクエリオブジェクトを持っている:

q['$and']=[]; 

これはMongoError: $and/$or/$nor must be a nonempty arrayエラーが発生します。 、

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

デレク謝罪、私は間違って何かを得た場合、間違って問題を指摘する必要はありません。ここで

は、私はこの問題を解決するためにやったことです。

+0

こんにちはVikas、Derekの回答に余計なステップを追加してくれてありがとう。これは私のシナリオでうまくいきました。 – user752746