【问题标题】:Rethinkdb - filtering by value in another tableRethinkdb - 按另一个表中的值过滤
【发布时间】:2015-08-14 05:54:43
【问题描述】:

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

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

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

如果您想知道,我们使用的是 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
  })

【问题讨论】:

  • 一些示例记录以查看您的架构会有所帮助...

标签: rethinkdb


【解决方案1】:

这会容易得多。

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

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

【讨论】:

    【解决方案2】:

    在任何发现之前创建适当的索引可能会更好。如果没有索引,您将无法在包含超过 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 将订单转换为等效的订单项

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      相关资源
      最近更新 更多