ArangoDB 在常规筛选查询中使用“COUNT INTO length”或聚合函数

krcsximq  于 2022-12-09  发布在  Go
关注(0)|答案(1)|浏览(335)

我正在使用Python访问ArangoDB,有时使用len(cursor)来判断结果是空的还是只有一个结果会很有用。
不幸的是,这通常会导致一个例外:

│arango.exceptions.CursorCountError: cursor count not enabled

source code of the cursor中,结果集中似乎需要一个计数变量。
根据文档,这是通过添加以下内容实现的:

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://stackoverflow.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}

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

plicqrtu

plicqrtu1#

COLLECT WITH COUNT和Cursor计数是两个不同的东西。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
)

这背后的原因是,预先计算该信息(结果集长度)的成本很高,如果可以的话,您希望避免它。
根据您的用例,当结果为空或仅包含一个元素时,最好不要区别对待游标。

相关问题