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

Returning MAX() and MIN() in one query

在 Linux 上的 RethinkDB 1.16.2-1 上,我有一个 "products" table,它有一个 "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 值?

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

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

您还可以使用 reduce (http://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()
    }
})