RethinkDB:查询嵌套的可选布尔字段
RethinkDB: Querying a nested optional boolean field
我在 CentOS 7 上的 RethinkDB 1.16.2-1 "store" 数据库有一个 "products" table,它有一个 "models" 数组。我想要 return 产品 ID 和所有包含 "isCatalogPick" 布尔值的模型,并忽略没有它的模型,如下所示:
{
"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)
)
也是 return 没有 '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
}
]
}
您可能认为在查询中将 "contains()" 替换为 "eq()" 会解决此问题,但 return 没有结果。
我的问题是,我将如何实现这一目标?不是必需的,但如果你能花时间解释为什么以下查询也不起作用,我认为这将对所有人有教育意义:
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)
})
)
您可以筛选两次,一次删除模型,一次删除没有剩余模型的产品:
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"))
我在 CentOS 7 上的 RethinkDB 1.16.2-1 "store" 数据库有一个 "products" table,它有一个 "models" 数组。我想要 return 产品 ID 和所有包含 "isCatalogPick" 布尔值的模型,并忽略没有它的模型,如下所示:
{
"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)
)
也是 return 没有 '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
}
]
}
您可能认为在查询中将 "contains()" 替换为 "eq()" 会解决此问题,但 return 没有结果。
我的问题是,我将如何实现这一目标?不是必需的,但如果你能花时间解释为什么以下查询也不起作用,我认为这将对所有人有教育意义:
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)
})
)
您可以筛选两次,一次删除模型,一次删除没有剩余模型的产品:
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"))