我在CentOS 7上的RethinkDB 1.16.2-1" store"数据库有一个"产品"有一个"型号"阵列。我想返回产品ID以及包含" isCatalogPick"的所有型号。 boolean和省略没有它的模型,如下所示:
{
"id": "mid-200" ,
"models": [
{
"isCatalogPick": true ,
"ssp": 20.95 ,
"weight": 0.07
} ,
{
"isCatalogPick": true ,
"ssp": 22.95 ,
"weight": 0.13
}
]
} {
"id": "msc-000" ,
"models": [
{
"ssp": 39.95 ,
"isCatalogPick": true ,
"weight": 0.17
}
]
}
我的查询:
r.db("store").table("products").pluck("id", "models").filter(
r.row("models")("isCatalogPick").contains(true)
)
还会返回没有' isCatalogPick'大概是因为我使用的是contains():
{
"id": "mid-200" ,
"models": [
{
"ssp": 14.95 ,
"weight": 0.24
} ,
{
"ssp": 17.95 ,
"weight": 0.08
} ,
{
"isCatalogPick": true ,
"ssp": 20.95 ,
"weight": 0.07
} ,
{
"ssp": 22.95 ,
"weight": 0.13
}
]
} {
"id": "msc-000" ,
"models": [
{
"ssp": 39.95 ,
"isCatalogPick": true ,
"weight": 0.17
}
]
}
你会认为替换"包含()"用" eq()"在查询中会解决此问题,但它不会返回任何结果。
我的问题是,我将如何实现这一目标?不是必需的,但如果你可以花时间解释为什么以下的查询也不起作用,我认为它对所有人都有教育意义:
r.db("store").table("products").pluck("id", "models").filter(
r.row("models")("isCatalogPick").eq(true)
)
r.db("store").table("products").pluck("id", "models").filter(
r.row("models").hasFields("isCatalogPick")
)
r.db("store").table("products").pluck("id", "models").filter(
r.row("models").filter(function (c) {return c("isCatalogPick").eq(true)})
)
r.db("store").table("products").pluck("id", "models").filter(
function(c) {
return c.hasFields({'models': {'isCatalogPick': true}})
}
)
r.db("store").table("products").pluck("id", "models").concatMap(r.row('models')).filter(function(m) {
return m.hasFields("isCatalogPick")
})
r.db("store").table("products").map( function (doc) {
return {images: doc("id"), models: doc("models")}
}).filter(
r.row("models").filter(function(c){
return c("isCatalogPick").eq(true)
})
)
答案 0 :(得分:0)
您可以过滤两次,一次删除模型,一次删除没有模型的产品:
r.db("store").table("products").pluck("id", "models").merge({
models: r.row('models').filter(function(m){ return m("isCatalogPick") })
}).filter(
r.row("models").isEmpty().not()
)
您还可以使用concatMap
来展示模型:
r.db("store").table("products").concatMap(function(p){
return p('models').merge({product_id: p('id')})
}).filter(r.row("isCatalogPick"))