在我们的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
})
答案 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
仅限于主索引。
一种有效的方法是使用getAll
和map
首先,创建索引:
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")
})