2014-02-12 49 views
0

我正在使用包含多組單選按鈕和複選框的快遞構建表單。提交時,表單選擇用於查詢數據庫中的「部分」集合。使用表單提交的數據同時使用單選按鈕和複選框查詢mongodb

形式例如:

<input type="radio" name="radio" value="radioOption1"> 
    <input type="radio" name="radio" value="radioOption2"> 
    <input type="checkbox" name="checkbox" value="checkOption1"> 
    <input type="checkbox" name="checkbox" value="checkOption2"> 

如果你選擇第一個單選和第一個複選框選項,並提交時,req.body樣子:

{radio:'radioOption1', checkbox:'checkOption1'} 

使用此蒙戈查詢時,工作正常使用匹配的選項名稱查找文檔:

db.collection('parts').find({option_name:{$in:req.body}}) 

但是,如果勾選兩個複選框, q.body變成:

{radio:'radioOption1', checkbox:['checkOption1','checkOption2']} 

雖然$在還發現單選按鈕鍵/值匹配,它不會爲複選框工作,現在他們都存儲在一個數組。有沒有辦法改變我的查詢或我的數據來解決這個問題?

編輯: Parts集合有一個看起來像文件:

{ 
     "option_name" : "radioOption1", 
     "price" : 100 
    } 
    { 
     "option_name" : "radioOption2", 
     "price" : 200 
    } 
    { 
     "option_name" : "checkOption1", 
     "price" : 300 
    } 
    { 
     "option_name" : "checkOption2", 
     "price" : 400 
    } 

EDIT2: 丹麥的回答解決了這個謎團。在快遞,運行查詢之前,我做的:

var productOptions = [] 

    // iterate thru req.body 
    for (var key in req.body) { 
     // check if array 
     if(Object.prototype.toString.call(req.body[key]) === '[object Array]') { 
     // push each array value to productOptions 
     for(var i = 0;i < req.body[key].length;i++) { 
      productOptions.push(req.body[key][i]) 
     } 
     } else { 
     productOptions.push(req.body[key]) 
     } 
    } 

然後改變了查詢,以使用新的productOptions數組:

db.collection('parts').find({option_name:{$in:productOptions}}) 

這一工程!請讓我知道,如果我的JavaScript可能更清潔。

+0

看了這幾分鐘,但試圖讓我的頭在你的模式。如果您可以使用您正在搜索的集合中的幾個示例文檔進行編輯,那將會很好。另外$ in需要一些不是你傳入的字段或文檔。 –

+0

編輯包含一些示例文檔。我想我的大問題是我是否應該使用$ in,或者如果有另一種方式。 $ in「works」,並且找到req.body中任何屬性值的文檔,它是一個字符串,但它不解析數組的屬性值。 – spencer

回答

1

$ in將正常工作。剛形成的所有選項的數組中req.body,如:

['radioOption1', 'checkOption1','checkOption2'] 

現在用這個,

db.collection('parts').find({option_name:{$in:['radioOption1', 'checkOption1','checkOption2']}}) 

這將檢索所有文件,其中OPTION_NAME或者是radioOption1或checkOption1或checkOption2。

+0

這樣做,謝謝!編輯這個問題來展示我如何使您的解決方案在Express中工作。 – spencer

相關問題