2015-04-06 73 views
1

在Linux上的RethinkDB 1.16.2-1上,我有一個「產品」表,其中包含「類別」數組和「模型」數組,如下所示:在一個查詢中返回MAX()和MIN()

{ 
"name": "ABC Cable Series" , 
"categories": [ 
    "Analog Audio>Instrument>Cables" , 
    "Analog Audio>Microphone Cables" 
    ] , 
"models": [ 
    { 
    "modelCode": "ABC-1" , 
    "ssp": 11.95 , ... 
    } , 
    { 
    "modelCode": "ABC-2" , 
    "ssp": 15.95 , ... 
    } 
] 
} , ... 

我需要同時獲得包含給定產品類別的產品中的最低和最高價格(ssp)範圍的產品。我目前能得到的最高價格是這樣的:

r.db("store").table("products").filter(function(prod) { 
    return prod("categories").contains(
    function(cat){return cat.match("^Analog Audio>") 
    }) 
}).concatMap(function(doc) { 
    return doc("models")("ssp") 
}).max() 

比運行2個查詢其他,有沒有更有效的方式在一個查詢來獲取兩個最大值和最小值?

+0

第二個想法是,最好是返回SSP值列表並計算應用程序中的MAX和MIN(數組最多包含200個價格)。你怎麼看? – Smyrnian 2015-04-06 22:41:19

回答

0

假設你想用這兩個值的對象,你可以做到以下幾點:

r.db('test').table('products').filter(function(prod) { 
    return prod("categories").contains(
    function(cat){return cat.match("^Analog Audio>") 
    }) 
}).concatMap(function(doc) { 
    return doc("models")("ssp") 
}) 
.coerceTo('array') // Convert Stream to Array 
.do(function (rows) { // Pass array to to `.do` 
    return {   // Return Object 
    max: rows.max(), 
    min: rows.min() 
    } 
}) 
+0

這很好,謝謝。考慮到查詢的複雜性,我的服務器平均只需要100ms左右的運行時間,這是相當不錯的。我必須說,儘管目前使用RethinkDB的一個負面問題是ReQL陡峭的非直觀學習曲線(至少對我來說)。大多數開發人員已經知道SQL,所以我認爲大多數人會更喜歡SQL,或者甚至是針對這個DB的增強型SQL,否則這是很棒的。 – Smyrnian 2015-04-08 01:19:26

1

您還可以使用reducehttp://rethinkdb.com/api/javascript/reduce/)來計算這兩個值,而所有的數據轉換到一個數組第一:

r.db("store").table("products").filter(function(prod) { 
    return prod("categories").contains(
    function(cat){return cat.match("^Analog Audio>") 
    }) 
}).map(function(doc) { 
    return { 
     min: doc("models")("ssp").min(), 
     max: doc("models")("ssp").max() 
    } 
}).reduce(function (le, ri) { 
    return { 
     min: r.expr([le("min"), ri("min")]).min(), 
     max: r.expr([le("max"), ri("max")]).max() 
    } 
}) 
+0

謝謝丹尼爾。但是,即使在最後修復缺少的花括號之後,我也會得到「TypeError:undefined不是函數」 – Smyrnian 2015-04-08 01:20:24

+0

對不起。問題是我在還原函數'r'中命名了一個函數參數,它掩蓋了我用於'r.expr'的'r'模塊。我在我的帖子中糾正了它。 – 2015-04-08 20:12:16

+0

沒問題,謝謝丹尼爾。一個快速:是什麼區別: 回刺( 「類」)包含( 功能(CAT){回報cat.match( 「^模擬音頻>」) }) 和 回報PROD (「categories」)。contains(r.row.match(「^ Analog Audio>」)) – Smyrnian 2015-04-09 02:10:08