在常规过滤查询中使用 "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
)
这背后的原因是,预先计算该信息(结果集长度)的成本很高,您希望尽可能避免它。
根据您的用例,当结果为空或仅包含一个元素时,不区别对待游标可能是更好的选择。
我正在使用 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
)
这背后的原因是,预先计算该信息(结果集长度)的成本很高,您希望尽可能避免它。
根据您的用例,当结果为空或仅包含一个元素时,不区别对待游标可能是更好的选择。