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"))