ArangoDb - 如何在限制之前计算过滤结果的数量

时间:2016-09-15 15:39:07

标签: filter pagination limit arangodb aql

db.query(aql `
   FOR doc IN ${collection} 
     FILTER REGEX_TEST(CONCAT(VALUES(doc, true)), ${queryStr}, true)
       SORT doc[${sortBy}] ${dir}
         LIMIT ${start, count} 
           RETURN doc._key
        `)
        .then(cursor => {
            cb(cursor._result)
        }, err => console.log(err))

我有上面的AQL查询, 我想在限制每页结果(对于分页目的)

之前计算过滤结果的总数

我认为问题类似于此MySQL - How to count rows before pagination?Find total number of results in mySQL query with offset+limit

希望在ArangoDb中使用AQL

部分解决方案可能是How to count number of elements with AQL?

那么,AQL对我的要求的有效/最佳解决方案是什么?

1 个答案:

答案 0 :(得分:8)

您可以在选项中设置标记fullCount,以便将光标创建为true。然后,结果将具有子属性statsfullCount的额外属性。

然后,您可以通过fullCount获取cursor.extra.stats.fullCount - 属性。此属性包含应用查询中最后一个LIMIT之前结果中的文档数。 see HTTP documentation

此外,您应该使用explain feature来分析您的查询。在您的情况下,您的查询将始终进行完整的集合扫描,因此无法很好地扩展。

<强>更新

我在您的代码中添加了fullCount标志。请注意,fullCount属性仅在LIMIT之前的结果数高于之后的结果时才会显示。

db.query(aql ` 
  FOR doc IN ${collection} 
    FILTER REGEX_TEST(CONCAT(VALUES(doc, true)), ${queryStr}, true)
      SORT doc[${sortBy}] ${dir}
        LIMIT ${start, count} 
          RETURN {family: doc.family, group: doc.group} `, {count:true, options:{fullCount:true} })
.then(cursor => { console.log(cursor) }, err => console.log(err))