在我的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值?
答案 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)
您还可以使用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()
}
})