2017-04-26 65 views
1

我們在RestHeart中有一個聚合查詢,效果很好。Restheart Aggregation Framework - 可選Avars?

match部分,我們允許用戶指定一個特定的文檔ID,只返回該文檔:

   "_$match" : { 
        "_id" : { 
         "_$var" : "n" 
        }, 

然而,我們也想讓用戶能夠忽略這一點,並得到所有收集文件。

是否有任何方法使avars可選,或者爲那個avar指定通配符?目前,如果用戶省略了阿瓦爾,他們會得到一個錯誤。並將avar設置爲null或者空字符串與這些值完全匹配。

我想另一種選擇是如果聚合查詢屬性中可以有條件邏輯 - 不知道這是否可能。

感謝

湯姆

回答

-1

可以使用$cond操作

計算一個布爾表達式返回兩個指定回報表現之一有一個有條件的聚集。

的$ COND表達有兩種語法之一:

{ $cond: { if: <boolean-expression>, then: <true-case>, else: <false-case-> } }

或者:

{ $cond: [ <boolean-expression>, <true-case>, <false-case> ] }

+0

完美---謝謝!所以在我的用例中,如果用戶爲「n」avar提供了一個值,那麼我將它包含在比賽中。 如果他們沒有給出一個值(我想這意味着我需要傳遞一個空字符串,所以ReSTHeart不會給出錯誤),那麼我不想在匹配字符串中包含該值。 我想我可能會需要,使用常規expresions做: $比賽:{ _id:{ 「$ COND」:{ 如果:{$ EQ:[{_ $ VAR」: 「N」 },「」]},然後:「/.*/」,else:{_ $ var「:」n「} } } } 這樣看起來合適嗎?還是有辦法做這不使用正則表達式? –

+0

我對此進行了進一步研究,$ cond操作符在匹配部分似乎不受支持,所以我不認爲這個解決方案能夠工作。我想出了一個使用正則表達式的替代方案(見下文) –

1

我已經找到了一個簡單的解決方案。 _properties集合中的聚合查詢可以保持原樣,但可以在GET請求中指定通配符。這裏有一個例子:

GET https://test.restheartapi.com:4443/DataBase/collection/_aggrs/items?avars={"n":/.*/, "m":/.*/ } 

...所以雖然它不可能使阿瓦爾在RestHeart可選的,它仍然可以指定一個通配符作爲值。

我不確定使用像這樣的正則表達式是否有小的性能打擊,但它似乎是現在唯一的簡單方法。

+1

兄弟!大擁抱你!你救了我的日子 – shivadarshan

+0

嗨即時通訊不能發送/.*/從JavaScript。它正在被{}(空對象)取代。你能幫忙嗎? – shivadarshan

+0

@ shivadarshan ---太好了!很高興聽到這有助於... –