在常规过滤查询中使用 "COUNT INTO length" 或聚合函数

Using "COUNT INTO length" or Aggregate-functions in a regular filtered Query

我正在使用 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 会导致错误。 post 会建议这样的解决方案:

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}

这是行不通的。插入这种聚合函数的正确查询是什么?

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
)

这背后的原因是,预先计算该信息(结果集长度)的成本很高,您希望尽可能避免它。

根据您的用例,当结果为空或仅包含一个元素时,不区别对待游标可能是更好的选择。