2017-01-28 7 views
1

私はMongooseとMongoDBの仕組みを理解しようとしています...私は本当にそれらには新しいので、値に基づいて値を返す方法を考えることはできません。 find文では、可能なクエリの中の指定されたパラメータのいくつかがnullです - これは何かのために設定できる属性ですか?空のパラメータを持つfind()文

さらに説明すると、会社を検索するための入力フィールドが異なるウェブページがありますが、すべて必須というわけではありません。

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

ウェブページの入力フィールドをすべて入力すると、結果が返されますが、その特定のものだけが一致します。 countryのみを記入したとしましょう。残りは空であるため何も返しませんが、たとえばすべての行を返したいとします。ドイツ語に。私は自分自身をはっきりと表現してくれることを望む

答えて

1

例えば

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

あなたは、彼らはその後、nullでない場合は別のアプローチは、空のパラメータをチェックするクエリを構築することになり、$orの論理演算子でクエリをラップする必要がありますこれをクエリの一部として含めます。たとえば、あなたは自分のクエリは、キーを想定してreq.queryオブジェクトを使用することができ、以下のように、ドキュメントのフィールドと同じです:上記で

/* 

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

req.queryオブジェクトがクエリとして機能していますカンマで区切られた式のリストを指定するとき、MongoDBは暗黙的なANDオペレーションを提供するので、暗黙の論理ANDオペレーションが実行されます。同じフィールドまたは演算子を複数の式で指定する必要がある場合は、$andの演算子を使用する必要があります。


あなたが満たす論理ANDOR両方すなわちpositioncountryためのクエリまたは任意の他のフィールド与え例えば両方の句の条件に一致するすべての文書を返すクエリの後にあるなら、あなたは、クエリを微調整すること

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

が、その後、再び、これはパラメータ等が必須として参加するために必要なものをクエリの対象となる可能性が

+0

私はそれを試してみます。どうもありがとうございました。 – Rasmus

+0

私は「UI開発者」と「フランス」を検索すると、すべての国の開発者とフランスのすべての職種を返すため、別の解決策を見つける必要があります。 – Rasmus

+0

特定のクエリ句が論理的な「AND」を満たすように、つまり両方の条件に一致するすべてのドキュメントを返すように、上記のクエリを微調整する必要があります。 – chridam

0

私は単純にパーを削除することになった:へクエリー内のametersが空の場合に備えて送信のすべてのテキストフィールドが ""(空)として送信されたようです。このような値はデータベースにはないので、何も返しません。それが私の心を交差させたことがないので、簡単な...

例:

if (req.query.companyName == "") { 
     delete req.query.companyName; 
} 
関連する問題