Rethinkdb - 按另一个表中的值过滤

时间:2014-07-28 17:07:58

标签: rethinkdb

在我们的RethinkDB数据库中,我们有一个订单表和一个存储所有订单商品的单独表。 OrderItems表中的每个条目都具有相应订单的orderId。

我想编写一个获取所有SHIPPED订单商品的查询(只是OrderItems表中的商品......我不想要整个订单)。但是订单是否已发货"存储在Order表中。

那么,是否可以根据"发货"来编写一个过滤OrderItems表的查询。 Orders表中相应订单的价值?

如果您想知道,我们正在使用Rethinkdb的JS版本。

更新:

好吧,我自己想出来了!这是我的解决方案。我并不认为这是最好的方式(当然也不是超级高效的),所以如果其他人有想法我仍然喜欢听他们。

我是通过运行.merge()来创建基于Order表的新字段,然后根据该值进行过滤。

对我的问题使用另一个表的过滤器的半泛化查询如下所示:

r.table('orderItems')
  .merge(function(orderItem){
    return {
      orderShipped: r.table('orders').get(orderItem('orderId')).pluck('shipped') // I am plucking just the "shipped" value, since I don't want the entire order
    }
  })
  .filter(function(orderItem){
    return orderItem('orderShipped')('shipped').gt(0) // Filtering based on that new "shipped" value
  })

2 个答案:

答案 0 :(得分:1)

它会更容易。

r.table('orderItems').filter(function(orderItem){
    return r.table('orders').get(orderItem('orderId'))('shipped').default(0).gt(0)
})

最好避免结果为NULL,添加'.default(0)'

答案 1 :(得分:0)

在任何发现之前创建正确的索引可能更好。如果没有索引,则无法在超过100,000个元素的表中找到文档。

此外,filter仅限于主索引。

一种有效的方法是使用getAllmap

首先,创建索引:

 r.table("orderItems").indexCreate("orderId")
 r.table("orders").indexCreate("shipStatus", r.row("shipped").default(0).gt(0))

使用该索引,我们可以找到所有出货单

r.table("orders").getAll(true, {index: "shipStatus"})

现在,我们将使用concatMap将订单转换为等效的orderItem

r.table("orders")
 .getAll(true, {index: "shipStatus"})
 .concatMap(function(order) {
      return r.table("orderItems").getAll(order("id"), {index: "orderId"}).coerceTo("array")
 })