2016-01-18 106 views
2

因此,我建立了一個查詢生成器,該生成器基於用戶與包含大量單選按鈕和下拉框等數據過濾區域的交互來構建查詢。類似於eBays數據過濾功能在其網站上提供的功能。

我的查詢生成器至今:

app.post('/user/test',function(req, res) { 

var query = {}; 


if (req.body.region){ 
    query.region = req.body.region 
    console.log(query.region) 
} 

if(req.body.sector){ 
    query.sector = req.body.sector 
    console.log(query.sector) 
} 

if(req.body.client){ 
    query.client = req.body.client 
    console.log(query.client) 
} 

    Project.find(query, function(err, project){ 
    if (err){ 
     res.send(err); 
    } 
    console.log(project); 
    res.json(project); 
}); 
}); 

現在上述作品非常好。我可以在任何情況下發送過濾選項,並且會帶回所需的結果。例如,我只能發送區域名稱,它會給我屬於該區域的所有數據,或者我可以發送區域名稱,區域名稱,並且會進一步過濾與發送區域和區域名稱匹配的數據等。

的問題:

現在我的數據庫中包含的數據就像一個數組:

words: ["book", "table", "pen"] 

數據庫中的每個對象都會有這樣的陣列。因此,如果數據庫中有100個對象,則其中的一個將具有具有不同或相似值的「字」數組。

我希望能夠發送多個選項,比如「table」,「pen」到我的數據庫,並獲取包含數據數組中的這兩個選項的所有對象。

爲了實現這個目標,我做了以下內容:

if (req.body.sol){ 

    var arr = []; 
    arr.push(req.body.sol) 
    query.words = {words: {$in: arr}} 
} 

以上沒有工作

但是,如果我做了以下修改這一行:

query.words = {words: {$in: arr}} 

query = {words: {$in: arr}} 

進行上述更改的工作,但隨後它不構建剩餘的查詢。它只生成「$ in」查詢。

任何想法如何解決這個問題?

回答

1

可以使用bracket notation添加$in運營商在查詢屬性:

if (req.body.sol){ 
    var arr = [], 
     obj = {};  

    arr.push(req.body.sol); 
    obj["$in"] = arr; 
    query.words = obj; 
} 
+1

太好了!這工作。感謝今天學到了新東西! – Skywalker

2

可以簡單的寫像

query.words = {$in: arr} 

這樣你就可以查詢構建其餘的查詢。


爲什麼query.words = {words: {$in: arr}}失敗的原因是查詢變成{words:{words: {$in: arr}}},這是不是你想要的,因爲它試圖找到裏面的話的話。

而是採用query.words = {$in: arr}會使你的查詢{words: {$in: arr}

+1

ahhh。這清除了這個愚蠢的錯誤。謝謝你真的幫助。 – Skywalker