2017-07-13 283 views
0

提前搜索查詢我想在其中可以有最多5個參數,搜索查詢,但它可以有任意數量則params的從下面5貓鼬:使用MongoDB的

01.name_or_number

02.from_date

03.to_date

04.is_validated

05.is_premium

我可以查詢如下。

var query = {$or:[ 
    {'name':nameOrNumber}, 
    {'number': nameOrNumber} 
    ]}; 

我想做出這樣的查詢應該只有有價值的領域。

類似於如果用戶選擇from_date和to_date和其他3個字段爲空,則查詢應僅使用2個日期參數進行搜索。

我可以通過if/else進行多個查詢,但是我想使單個查詢可以做到這一點。

案例1: - 用戶可使用name_or_number

案例2搜索: - 用戶可以搜索使用FROM_DATE和/或TO_DATE

情況3: - 用戶可以同時使用name_or_number和日期

搜索

情況4: - 用戶可以搜索使用is_validated和/或is_premium

案例5: - 用戶可與所有5個PARAMS

更多的情況下搜索...

這可能嗎?如果是,如何?

謝謝

+0

所以'$或'基本上需要一個參數的「list」或「array」。它(像整個MongoDB查詢DSL)實際上只是一個普通的JavaScript對象或數組。只是操縱對象。根據需要將新項目推送到陣列上。 –

+0

@ Neil ......我幾天前開始學習它。是否有可能通過代碼或參考向我展示。 – Hitendra

+0

學習什麼? JavaScript的?這是我試圖指示你實現的基本列表操作。這裏沒什麼特別的,只是簡單的數據結構。 –

回答

0

是的,這是可能的。您需要爲您的貓鼬查詢創建一個動態生成的查詢對象(在本例中稱爲'queryObj')。您的服務器端腳本應該遍歷用戶選擇搜索的客戶端發送到服務器的數據,並在該流程中創建包含屬性名稱(例如'name')的鍵值對以搜索您的MongoDB集合並潛在的匹配/匹配(例如'David')。請注意,我建議將每個屬性名稱的潛在匹配項存儲在一個數組中。最後,你只需在一個貓鼬查找查詢中放置並使用queryObj,如下所示:

var queryObj = {}; 

// iterate through the data you sent to the server 
    for (var i = 0; i < data.length; i++) { 
     if (data[i].values.length > 0) { 
     queryObj[data[i].keys] = { $in: data[i].values }; 
     } 
    } 

// now place that new object into your mongoose query 
    Account.find(queryObj, function (err, results) { 
     if (err) { 
      throw err; 
     } else { 
     // do whatever you want with your results 
      results; 
     } 
    }); 
+1

我已經完成了Neil的建議。感謝您的努力。 – Hitendra