You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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:两步临时查询(适合低频查询无需建索引)

如果是临时查询不想额外创建索引,可以分两步走:

  1. 先查询所有状态非Booked的Appointment,拿到对应BikeID的集合
from Appointments
where Status != 'Booked'
select BikeID
  1. 用第一步拿到的BikeID集合,查询匹配的Bike文档
from Bikes
where id() in ($bikeIds)

查询时把第一步返回的ID列表作为$bikeIds参数传入即可,RavenDB会自动缓存两步的查询结果,低频使用场景下性能完全够用。


内容的提问来源于stack exchange,提问作者rafalxyz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 20:15:04