求助:使用Python对DynamoDB非排序键日期列降序排序
问题与解决方案:DynamoDB查询结果按ID分组并按日期列降序排序
问题背景
作为DynamoDB和Python新手,需要查询DynamoDB数据并按非排序键的日期列(字符串格式YYYYMMDD_HHMMSS)降序排序。使用Boto3的query方法获取数据后,无法通过DynamoDB原生查询实现该排序逻辑,需在Python中对返回的result["items"]进行处理,要求:
- 先按
id字段分组 - 每组内按
dateColumn字段降序排列
查询代码:
result = TABLE.query( KeyConditionExpression="partitionKey = :pk", ExpressionAttributeValues={ ":pk": partitionKey } )
原始数据示例:
[ { "id": "colV", "dateColumn": "20231104_122600" }, { "id": "colV", "dateColumn": "20231105_122600" }, { "id": "colX", "dateColumn": "20231114_122600" }, { "id": "colX", "dateColumn": "20231105_122600" } ]
期望结果:
[ { "id": "colV", "dateColumn": "20231105_122600" }, { "id": "colV", "dateColumn": "20231104_122600" }, { "id": "colX", "dateColumn": "20231114_122600" }, { "id": "colX", "dateColumn": "20231105_122600" } ]
解决方案
由于dateColumn采用YYYYMMDD_HHMMSS格式的字符串,其字典序与时间顺序完全一致,无需转换为datetime对象即可直接排序。以下提供两种实现方式:
方法1:使用字典分组(保留原始ID出现顺序)
from collections import defaultdict # 获取查询返回的items items = result["items"] # 步骤1:按id分组 grouped_items = defaultdict(list) for item in items: grouped_items[item["id"]].append(item) # 步骤2:每组内按dateColumn降序排序 for id_key in grouped_items: grouped_items[id_key].sort(key=lambda x: x["dateColumn"], reverse=True) # 步骤3:按原始数据中id的出现顺序合并结果 sorted_result = [] seen_ids = [] for item in items: current_id = item["id"] if current_id not in seen_ids: seen_ids.append(current_id) for id_key in seen_ids: sorted_result.extend(grouped_items[id_key])
方法2:使用itertools.groupby(需先按ID排序)
from itertools import groupby # 获取查询返回的items items = result["items"] # 先按id排序,确保groupby能正确分组 sorted_by_id = sorted(items, key=lambda x: x["id"]) # 分组并对每组内数据降序排序 sorted_result = [] for id_key, group in groupby(sorted_by_id, key=lambda x: x["id"]): # 对当前组按dateColumn降序排列 sorted_group = sorted(group, key=lambda x: x["dateColumn"], reverse=True) sorted_result.extend(sorted_group)
两种方法最终都会得到符合要求的排序结果,方法1会保留原始数据中id首次出现的顺序,方法2则会按id的字典序排列分组。
内容的提问来源于stack exchange,提问作者Vishu
相关产品推荐
相关产品推荐

