如何在RavenDB中按关联文档过滤并将指定SQL查询转换为RQL
RavenDB中实现关联文档过滤的两种可行方案
RavenDB不支持类似SQL的Join操作,也不能用load子句做关联过滤,你可以根据查询频率选以下两种方案实现需求:
方案1:预创建带关联字段的索引(推荐高频查询使用)
这是性能最优的方案,你可以在Bike集合的索引定义中,通过LoadDocument在索引构建阶段就加载关联的Appointment文档,把需要过滤的状态字段存入索引:
// 索引定义示例(C#语法,也可以直接在RavenDB Studio中创建JavaScript索引) public class Bikes_WithAppointmentStatus : AbstractIndexCreationTask<Bike> { public Bikes_WithAppointmentStatus() { Map = bikes => from bike in bikes let appointment = LoadDocument<Appointment>(bike.BikeID, "Appointments") select new { bike.Id, // 其他你需要返回的Bike字段 AppointmentStatus = appointment.Status }; } }
索引创建完成后,你直接用RQL查询即可:
from index 'Bikes/WithAppointmentStatus' where AppointmentStatus != 'Booked' select *
方案2:两步临时查询(适合低频查询无需建索引)
如果是临时查询不想额外创建索引,可以分两步走:
- 先查询所有状态非Booked的Appointment,拿到对应BikeID的集合
from Appointments where Status != 'Booked' select BikeID
- 用第一步拿到的BikeID集合,查询匹配的Bike文档
from Bikes where id() in ($bikeIds)
查询时把第一步返回的ID列表作为$bikeIds参数传入即可,RavenDB会自动缓存两步的查询结果,低频使用场景下性能完全够用。
内容的提问来源于stack exchange,提问作者rafalxyz
相关产品推荐
相关产品推荐

