2015-04-02 30 views
1

CentOS 7上的My RethinkDB 1.16.2-1“store”数据库有一个“products”表,它有一个“models”数组。我想回到的产品ID,并包含“isCatalogPick”布尔并省略车型全系车型没有它,就像这样:RethinkDB:​​查询嵌套的可选布尔字段

{ 
    "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”大概是因为我使用的包含():

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

您可以过滤两次,一次取出模型,一旦与没有留下任何型号删除产品:

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

谢谢。第一个(虽然对我来说更复杂)性能稍微好一点(〜400ms vs〜450ms)。你能告诉我为什么以下不起作用?这似乎是最直观的解决方案。 r.db(“store”)。table(“products”)。pluck(“id”,“models”)。filter( r.row(“models”)(“isCatalogPick”)。eq(true) ) – Smyrnian 2015-04-03 00:04:24

+0

'r.row(“models”)(“isCatalogPick”)'是一组布尔值,不等于true。 – AtnNn 2015-04-03 00:22:05

+0

我明白了。这个(我承诺的最后一个)如何: r.db(“store”)。table(“products”)。pluck(“id”,“models”)。 .hasFields(“isCatalogPick”) ) – Smyrnian 2015-04-03 00:37:01