在一个查询中返回MAX()和MIN()

时间:2015-04-06 09:24:12

标签: rethinkdb

在我的Linux上的RethinkDB 1.16.2-1中,我有一个“产品”表,它有一个“categories”数组和一个“models”数组,如下所示:

{
 "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个查询之外,是否有更有效的方法在一个查询中获取MAX和MIN值?

2 个答案:

答案 0 :(得分:1)

假设您想要一个具有两个值的对象,您可以执行以下操作:

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()
  }
})

答案 1 :(得分: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()
    }
})