ArangoDB AQL查询如何正确添加COUNT聚合函数解决CursorCountError问题
解决方案
报错原因说明
你修改后的语句存在两个核心错误:
COLLECT属于聚合操作,执行后会清空之前遍历产生的变量作用域,无法再访问之前的m变量,同时你返回时误用了未定义的i变量,直接触发语法错误COLLECT WITH COUNT默认会把结果聚合为单条统计值,无法直接同时返回原始匹配数据和统计总数
方案1:无需修改AQL,直接修复Python端len(cursor)报错
你最初遇到的CursorCountError本质是查询执行时未要求服务端返回结果总数,不需要修改AQL语句,只要在python-arango调用执行查询时添加count=True参数即可:
# 你的原始AQL无需改动 aql = """ FOR i IN nodes FILTER i.ID == "3000" OR i.ID == "3005" OR i.ID == "11235" RETURN {'_id':i._id,'id':i.id} """ # 执行时添加count=True参数 cursor = db.aql.execute(aql, count=True) # 此时len(cursor)可正常使用 print(len(cursor))
该方案完全满足你判断结果是否为空、是否只有1条的需求,是成本最低的解决方案。
方案2:需要在AQL返回结果中附带总条数
如果确实需要每条返回结果都附带总统计值,使用子查询+LENGTH函数实现即可,也可以顺便优化原FILTER的多个OR写法为IN更简洁:
LET matched_nodes = ( FOR i IN nodes FILTER i.ID IN ["3000", "3005", "11235"] RETURN {'_id': i._id, 'id': i.id} ) # 遍历结果并拼接总长度 FOR node IN matched_nodes RETURN MERGE(node, {'total_length': LENGTH(matched_nodes)})
方案3:仅需要统计总数不需要返回具体数据
如果只需要获取匹配条数,不需要具体内容,直接使用COLLECT WITH COUNT即可:
FOR i IN nodes FILTER i.ID IN ["3000", "3005", "11235"] COLLECT WITH COUNT INTO total_length RETURN total_length
内容的提问来源于stack exchange,提问作者Qohelet
相关产品推荐
相关产品推荐

