在常规过滤查询中使用“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 长度”或聚合函数的主要内容,如果未能解决你的问题,请参考以下文章

会员管理小程序实战开发教程-按条件过滤数据

详解布隆过滤器的原理和实现

PHP按类别过滤搜索结果并计数

Bloom Filter实现大数据集查询

Bloom Filter实现大数据集查询

Drupal 7 视图 - 如何将上下文过滤器与常规过滤器(使用 OR)结合起来?