在一个查询中返回 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()
}
})
在 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()
}
})