2017-07-25 58 views
2

我是比較新的蒙戈&貓鼬,我碰到一個問題。帶有可選參數的Mongoose複雜查詢?

我有一個合理的(對我來說)複雜的查詢,這將允許用戶搜索所有輸入的術語。

所以如果查詢是像這樣:

var query = { '$and' : [ 
    { "foo1" : "bar1" }, 
    { '$and' : [ "foor2" : { $ne : null } }, { "foo2" : "bar2" } ] }, 
    { "foo3" : "bar3" } 
]}; 

Doc.find(query); 

,但用戶可以輸入任何數字組合爲參數,即我可以搜索匹配foo1 & foo2的,或者只是所有的項目,所有項目匹配foo2,或只是foo3等

有沒有辦法告訴查詢只查找參數,如果它不是空的,或者有沒有一種方法來編譯這樣的編程?我所看到的其他選項,添加這樣的參數,但他們似乎只在標準

{ foo : 'bar' } 

格式添加,出於某種原因,他們似乎總是被添加到查詢是否符合,如果條件聲明與否。

謝謝。

回答

1

首先,你不需要$and運營商爲你想要的。逗號分隔隱含and

你的榜樣查詢應該僅僅是:

var query = { 
    "foo1": "bar1", 
    //"foo2": { $ne: null}, is unnecessary as "foo2" is being searched for "bar2" already, so it won't be null 
    "foo2": "bar2", 
    "foo3": "bar3" 
}; 

動態構建此查詢,您可以檢查參數(比如req.body)逐一將它們添加到查詢用括號標記對象:

var query = {}; 

if (req.body.foo1) { 
    query["foo1"] = req.body.foo1 
} 

if (req.body.foo2) { 
    query["foo2"] = req.body.foo2; 
} 

if (req.body.foo3) { 
    query["foo3"] = req.body.foo3; 
} 

或者,您可以遍歷參數並構建相同的查詢對象如果您確定它們包含的內容:

var query = {}; 

for(var key in req.body){ 
    query[key] = req.body[key]; 
} 
+1

很酷的感謝,我設法弄清楚如何做到這一點,但很高興知道我來到了正確的解決方案。我想通過提出一個看起來比所需要的更復雜的查詢,我的生活變得更難了。菜鳥的錯誤:) – user3075259