2016-09-07 6 views
0

私はコレクションを動的にクエリする方法を頭で覆そうとしています。私は以下のスキーマを持つコレクションを持っています。ダイナミックMongoDbクエリを構成する方法

Tripart_Property_Schema = new SimpleSchema({ 
    "type" : { 
     type : String, 
     label : 'Property type',  
    }, 

    "sale_lease" : { 
     type : String, 
     label : '', 
    }, 

    "location" : { 
     type : Object, 
     label : '', 
     optional : true 
    }, 

    "location.state" : { 
     type : String, 
     label : 'state',  
    }, 

    "location.lga" : { 
     type : String, 
     label : 'lga', 
     optional : true 
    }, 

    "location.address" : { 
     type : String, 
     label : 'address', 
     optional : true 
    }, 

    "amount" : { 
     type : Object, 
     label : '', 
     optional : true 
    }, 

    "amount.amount" : { 
     type : Number, 
     label : '', 
     optional : true 
    }, 

    "amount.discount" : { 
     type : Number, 
     label : '', 
     optional : true 
    }, 

    "active" : { 
     type : Boolean, 
     label : '', 
     optional : true 
    }, 

    "views" : { 
     type : Number, 
     label : '', 
     optional : true 
    }, 

    "date_added" : { 
     type : Date , 
     label : '', 
     optional : true 
    }, 

    "general_features" : { 
     type : [String], 
     label : '', 
     optional : true 
    }, 

    "outdoor_features" : { 
     type : [String], 
     label : '', 
     optional : true 
    }, 

    "indoor_features" : { 
     type : [String], 
     label : '', 
     optional : true 
    }, 

    "other_facilities" : { 
     type : Object, 
     label : '', 
     optional : true 

    }, 

    "other_facilities.bedroom" : { 
     type : Number, 
     label : '', 
     optional : true 
    }, 

    "other_facilities.bathroom" : { 
     type : Number, 
     label : ' ', 
     optional : true 
    }, 

    "other_facilities.garage" : { 
     type : Number, 
     label : '', 
     optional : true 
    }, 

    "other_facilities.staffQuaters" : { 
     type : Number, 
     label : '', 
     optional : true 
    } 
}); 

ユーザーが使用可能なフィールドの任意の組み合わせを使用してデータを照会できるユーザーインターフェイスを作成しました。ユーザーは、sale_leaseフィールド、amount.amountフィールドを使用してプロパティを検索するクエリを作成し、配列であるgeneral_featuresフィールドを照会することもできます。ユーザーが選択した設定に基づいてこのクエリを生成する方法がわかりません。私は手で質問されたフィールドを知っているクエリを実行する方法を知っていますが、それを動的にすることはどこに問題があるかです。

複数のフィールドを使用できるようにするために複数の文を使用しようとしていますが、これを実現する方法ではないことがわかりました。私は正しい方向を指すことができれば非常に感謝します。

+0

いいえ、あなたはそれをexpatiateできません。ありがとうございます –

+0

申し訳ありません、質問を誤読 – chridam

+0

を参照してください。https://stackoverflow.com/questions/31995166/mongoose-optional-search-query-parameters – JohnnyHK

答えて

0

あなたのコレクションにいくつかのキーがある簡単な例を考えてみましょう。ユーザーはそれらの任意の組み合わせを照会でき、結果をANDしたいとします。典型的なパターンは次のようになります:

簡単にするために、上記の説明では、各検索フィールドに対応するスキーマフィールドと等しいIDを与えたと仮定しています。あなたの命名規則は異なる場合があります。

空白のクエリオブジェクトから始め、次に各検索フィールドを調べます。空でない場合は、検索するスキーマキーに対応するクエリにキーを追加します。

名前付け規則と単純なフィールド構造を使用すると、jsループでこれを実行することもできますので、キーごとにif文を使用する必要はありません。

+0

ありがとう@Michelフロイドあなたの提案は動作しますが、私は少し問題を質問している値はオブジェクトです。私のスキーマlocation.stateを使うのと同じです。私は答えとしてそれを受け入れることができるようにあなたの答えを更新してください。 –

0

ユーザーがクエリやコレクションの名前などをどのように選択できるかについての詳細を知らないと、詳細な例を提供することは困難です。ただし、ユーザーの選択を受け取り、それをクエリパラメータオブジェクトに変換できる必要があります。たとえば、ユーザーがsale_leaseフィールドの選択を行った場合、あなたは次のことを行うことができ、コレクション名がTripart_Propertyであると仮定すると:

var saleLeaseSelection = argumentContainingSelectionFromUser; 
var customQuery = { sale_lease: saleLeaseSelection }; 
Tripart_Property.find(customQuery); 

これは非常に基本的な例です。 argumentContainingSelectionFromUserは、ユーザーが選択したデータです。クライアントから呼び出すことができ、クエリの結果を返すようにサーバーにメソッドを構築して、ユーザーに表示することができますが、少なくとも正しい方向を指すようにする必要があります。

関連する問題