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

如何在RavenDB中按ID分组查询最小与最大日期?

解决RavenDB中按ID分组查询最小/最大日期的问题

我来帮你搞定这个RavenDB的查询难题!你的核心需求是按Payload.Id分组,分别获取每个ID对应的最早territory_entry和最晚territory_exit记录,原来的查询思路偏了——你在操作单文档内的Lines数组,但实际上需要跨文档做分组聚合。

正确的RQL查询方案

方案1:获取聚合后的时间戳(简洁版)

如果只需要每个ID对应的最小entry时间和最大exit时间,用这个查询就够了:

from 'event' as e
where e.Header.Name in ('territory_entry', 'territory_exit') 
  and e.Payload.Id in ('123', '456')
group by e.Payload.Id
select {
  Id: key(),
  MinEntryTimestamp: min(case when e.Header.Name = 'territory_entry' then e.Header.Timestamp else null end),
  MaxExitTimestamp: max(case when e.Header.Name = 'territory_exit' then e.Header.Timestamp else null end)
}

逻辑解释:

  1. 先过滤出符合类型(entry/exit)和目标ID的文档
  2. 按Payload.Id分组,key()会返回当前分组的ID值
  3. 用case语句筛选出对应类型的时间戳,再通过min/max聚合得到每个ID的目标时间

方案2:返回完整的记录(含所有字段)

如果需要返回完整的文档数据(不只是时间戳),可以用子查询关联获取匹配的文档:

// 第一步:先聚合得到每个ID的最小entry和最大exit时间戳
let aggregatedData = (
  from 'event' as e
  where e.Header.Name in ('territory_entry', 'territory_exit') 
    and e.Payload.Id in ('123', '456')
  group by e.Payload.Id
  select {
    Id: key(),
    MinEntryTs: min(case when e.Header.Name = 'territory_entry' then e.Header.Timestamp else null end),
    MaxExitTs: max(case when e.Header.Name = 'territory_exit' then e.Header.Timestamp else null end)
  }
)

// 第二步:根据聚合的时间戳,查询对应的完整文档
from aggregatedData as agg
select {
  Id: agg.Id,
  MinEntryRecord: (
    from 'event' as e 
    where e.Payload.Id = agg.Id 
      and e.Header.Name = 'territory_entry' 
      and e.Header.Timestamp = agg.MinEntryTs 
    limit 1
  ),
  MaxExitRecord: (
    from 'event' as e 
    where e.Payload.Id = agg.Id 
      and e.Header.Name = 'territory_exit' 
      and e.Header.Timestamp = agg.MaxExitTs 
    limit 1
  )
}

逻辑解释:

  1. 子查询aggregatedData先完成时间戳的聚合
  2. 外层查询针对每个分组的ID,精准查询对应时间戳的完整文档,limit 1确保只返回匹配的那条记录

你原来查询的问题所在

  • 错误地针对单文档内的Lines数组做map操作,但你的需求是跨文档的分组聚合,不是处理单个文档的内部数组
  • 没有使用group by按Payload.Id分组,无法实现按ID聚合统计的效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 17:29:11