【问题标题】:Using "COUNT INTO length" or Aggregate-functions in a regular filtered Query在常规过滤查询中使用“COUNT INTO 长度”或聚合函数
【发布时间】: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://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}

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

【问题讨论】:

    标签: arangodb aql python-arango


    【解决方案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
    )
    

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

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

    【讨论】:

    • 它甚至在文档中!感谢您的支持!
    猜你喜欢
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多