SharePoint Online:用于List的REST API,调用Filters并限制返回项

时间:2016-11-01 14:46:02

标签: rest sharepoint-online

我正在尝试使用以下REST API调用REST API列表

https://myweb.sharepoint.com/teams/sites/subwebs/_api/web/lists/GetByTitle('MyList')/Items?
$top=1
&$orderby=ID
&$select=ID,FName,LName,Title
&$filter=Title eq 'Female'

我需要$ filter应该使用限制为$ top的记录数。如果未应用$ filter,$ top将起作用。

好吧,我的列表包含超过5000的项目。我在上面的网址获取GET请求时收到以下错误消息

{
"readyState": 4,
"responseText": "{\"odata.error\":{\"code\":\"-2147024860, Microsoft.SharePoint.SPQueryThrottledException\",\"message\":{\"lang\":\"en-US\",\"value\":\"The attempted operation is prohibited because it exceeds the list view threshold enforced by the administrator.\"}}}",
"responseJSON": {
    "odata.error": {
        "code": "-2147024860, Microsoft.SharePoint.SPQueryThrottledException",
        "message": {
            "lang": "en-US",
            "value": "The attempted operation is prohibited because it exceeds the list view threshold enforced by the `enter code here`administrator."
        }
    }
},
"status": 500,
"statusText": "Internal Server Error"
}

3 个答案:

答案 0 :(得分:3)

抛出异常Microsoft.SharePoint.SPQueryThrottledException,因为$filter=Title eq 'Female'查询导致遍历整个列表并检查每一行以查看它是否匹配。

根据MSDN

  

列表视图阈值不仅仅适用于结果数   您的查询返回。相反,它限制了数据库的数量   可以访问的行以完成查询的执行   在内容数据库的行级别。

这就是$top查询选项在此处不适用的原因。

避免此问题的一个选项是索引Title字段。

转到List Settings -> Indexed Columns -> Create a new index -> select Title as a Primary Column

enter image description here

索引Title字段后,以下查询应成功:

https://site/_api/web/lists/GetByTitle('<list title>')/Items?$top=1&$orderby=ID&$select=ID,Title&$filter=Title eq '<value>'

答案 1 :(得分:1)

我知道这听起来很明显,但是第一个过滤器必须返回5,000个或更少的项。 然后,您可以添加其他过滤器。在这种情况下,您可能不需要$ top参数。 例如:

https://site/_api/web/lists/GetByTitle('<List Title>')/Items?$filter=<Column Name> eq '<A value that you know returns 5,000 items or less>' and Title eq 'Female'

答案 2 :(得分:-1)

Promise.all([
rest call # 1 query : queryFilter:"ID lt '3000' and  Title eq '000672'"
rest call # 2 query : queryFilter:"ID gt '2999' and  Title eq '000672'"


.then( arr=> {
        let fullArr = [...a[0],...a[1]]