在常规过滤查询中使用“COUNT INTO 长度”或聚合函数
Posted
技术标签:
【中文标题】在常规过滤查询中使用“COUNT INTO 长度”或聚合函数【英文标题】:Using "COUNT INTO length" or Aggregate-functions in a regular filtered Query 【发布时间】:2021-11-27 09:31:17 【问题描述】:我正在使用 Python 访问我的 ArangoDB。有时,使用len(cursor)
确定结果是否为空或者我是否只有一个结果会很有用。
不幸的是,这主要导致异常:
│arango.exceptions.CursorCountError: cursor count not enabled
在source code of the cursor 中,结果集中似乎需要一个计数变量。
根据the documentation,这是通过添加:
COLLECT WITH COUNT INTO length
在我的例子中,我使用了一个简单的、大部分是自动生成的查询来过滤所有内容:
FOR i IN nodes
FILTER i.ID == "3000" OR i.ID == "3005" OR i.ID == "11235"
RETURN '_id':i._id,'id':i.id
添加COLLECT
会导致错误。这篇https://***.com/a/24131344/2516892 的帖子会提出这样的解决方案:
FOR m IN nodes
FILTER m.ID == "3000" OR m.ID == "3005" OR m.ID == "11235"
COLLECT WITH COUNT INTO length
RETURN '_id':i._id,'id':i.id, 'length': length
这不起作用。插入这种聚合函数的正确查询是什么?
【问题讨论】:
【参考方案1】:COLLECT WITH COUNT
和光标计数是两个不同的东西。 COLLECT WITH COUNT INTO length
允许您获得一个文档,其中包含属性以及有多少文档具有这些不同属性的信息,例如您有多少用户年龄在 25 到 30 岁之间。
游标计数是总共要获取多少个结果的信息。根据文档,您必须指定您希望光标在创建过程中使用count=True
提供此信息,如下所示:
# Execute an AQL query which returns a cursor object.
cursor = db.aql.execute(
'FOR doc IN students FILTER doc.age > @val RETURN doc',
bind_vars='val': 17,
batch_size=2,
count=True
)
这背后的原因是,预先计算该信息(结果集长度)的成本很高,如果可以的话,您希望避免它。
根据您的用例,当结果为空或仅包含一个元素时,不区分游标可能是更好的选择。
【讨论】:
它甚至在文档中!感谢您的支持!以上是关于在常规过滤查询中使用“COUNT INTO 长度”或聚合函数的主要内容,如果未能解决你的问题,请参考以下文章