RethinkDB:​​查询嵌套的可选布尔字段

时间:2015-04-02 08:07:37

标签: rethinkdb

我在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)
})
)

1 个答案:

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