如何按processId分组并获取每组updatedAt最新的文档?
可以通过单条Elasticsearch查询实现需求
完全可以用单条查询搞定,核心思路是过滤目标processId + 按processId分组取最新文档,用Elasticsearch的terms聚合配合top_hits聚合就能实现。
完整查询示例
{ "size": 0, // 不需要返回原始匹配的文档,只看聚合结果 "query": { "terms": { "processId": ["cd88e9bc-2375-4c4a-80ef-7ec715e2c859", "Process_b77f8ac"] // 替换成你要匹配的processId数组,单个id也支持 } }, "aggs": { "group_by_processId": { "terms": { "field": "processId", "size": 1000 // 设为你需要匹配的processId数量上限 }, "aggs": { "latest_doc": { "top_hits": { "size": 1, "sort": [{"updatedAt": {"order": "desc"}}], "_source": true // 设为true返回完整文档,也可以指定具体字段列表 } } } } } }
关键逻辑说明
- 过滤匹配:
query中的terms条件精准筛选出你指定的processId对应的所有文档,单个processId直接写成单元素数组即可。 - 分组聚合:
group_by_processId按processId对文档分组,确保每个processId单独处理。 - 提取最新文档:嵌套的
latest_doc聚合通过top_hits实现,按updatedAt降序排序后只取第一条,保证每个分组返回的是最新更新的文档。 - 结果获取:最终结果会在
aggregations.group_by_processId.buckets中,每个bucket对应一个processId,其下的latest_doc.hits.hits[0]就是该processId的最新文档。
针对你提供的示例数据,执行该查询后会返回:
cd88e9bc-2375-4c4a-80ef-7ec715e2c859对应更新时间为2024-11-14T17:56:36.694873+03:00的文档Process_b77f8ac对应的唯一文档
内容的提问来源于stack exchange,提问作者Вячеслав Чернышов
相关产品推荐
相关产品推荐

