2016-10-26 6 views
0

私はMEANスタック(MongoDB/Express/Angular/Node)を使用してWebサイトを開発しています。特定のフィールドと属性に基づいて文書をフィルタリングする

サイズ、色、ブランド、モデルなど、12種類のフィールド/プロパティを持つ製品スキーマがあります。製品を角型またはサーバー側でフィルタリングする最も効率的な方法は何ですか?クライアントが複数のプロパティを選択した場合、結果を連鎖させることはできますか?その外観はどうですか?

+0

マングースを介して行います。すべての文書をコード内に戻し、それをフィルタリングすることは非常に非効率的です。ドキュメントを見てくださいhttp://mongoosejs.com/docs/queries.html – VtoCorleone

+0

私の答えは役に立ちましたか? –

答えて

1

多くの製品が存在すると仮定すると、Angularを使用してフィルタリングするには、クライアントにダウンロードするにはあまりにも多くなります。それはうまくスケールされません。製品のリストがますます大きくなるにつれて、パフォーマンスは低下します。より良い方法は、一般に、MongoDBにフィルタリングをさせることです。非常に速いです。

しかし、あなたはエンドポイント上のサーバーにしたいフィルタリング用語を掲載することにより角度からフィルタリングを制御することができ、たとえば、フィルタリングの方法に使用する、HTTPモジュールを使用して

http.post('/api/filter/' + methodOfFiltering, { 'term': termtoFilterBy }, function(dataReturned) { 
    // use dataReturned to do something with the data 
}); 

入れこれは角度サービスの方法で、それをあなたのコントローラ/コンポーネントのいずれかに注入することができます。

mongooseクエリでメソッドとキーワードを使用するエンドポイントを作成します。あなたのサーバールートにExpressを使用していると仮定しています。

app.post('/api/filter/:method', function(req, res) { 

    var method = req.params.method; 
    var termToFilterBy = req.body.term; 

    productSchema.find({method: termToFilterBy}, function(err, products) { 
     res.send(products); 
    }); 

}); 

これが役立つかどうか教えてください。

+0

私はこの分野でかなり新しいことを認めます。しかし、DBにリクエストパラメータ*を直接渡すと、SQLインジェクションのようなセキュリティホールが開かれないのではないでしょうか?私は、この習慣をプロダクションでもお勧めしますか? – Attilio

+0

さて、いくつかのチェックを追加して、特定のメソッドと特定のフィルタ条件のリクエストのみが送信されていることを確認することができます。この場合、フィールド(「サイズ」、「色」など)が存在しない場合は、おそらくエラーが発生し、フィルターの項が何も一致しない場合は、空の配列が返されます。私はこの方法であなたのデータベースに何が追加されるのかは分かりません。 –

+0

この* post *はa * get *のよりスマートなバージョンです。私はSQLインジェクションのようなものはここで懸念しているとは思わないが、他の人にはそれに重きを置くだろう。 –

関連する問題