在documentdb中使用存储过程执行ST_WITHIN

本文关键字:执行 ST WITHIN 存储过程 documentdb | 更新日期: 2023-09-27 18:14:31

我试图获得我的位置在一个多边形内的计数。下面是我的存储过程:

function count(poly) {
var collection = getContext().getCollection();
var query = {query: 'Select f.id from f WHERE ST_WITHIN(f.location, @poly)',
            parameters: [{name: '@poly', value: poly}]};
var isAccepted = collection.queryDocuments(
    collection.getSelfLink(),
    query,
    function (err, docs, options) {
        if (err) throw err;
        if (!docs || !docs.length) getContext().getResponse().setBody('no docs found');
        else getContext().getResponse().setBody(docs.length);
    });
if (!isAccepted) throw new Error('The query was not accepted by the server.');}

当我在查询资源管理器中执行相同的查询时,我得到了结果,但通过存储过程,它返回"no docs found"。它为更简单的查询返回结果,但对于它,返回的最大计数始终是100。我不知道我做错了什么。

提前感谢。

注::我尝试使用ST_DISTANCE为这些坐标。它确实返回count为100(最大值),但对于ST_WITHIN根本不起作用。

编辑:它不起作用。所以我按照官方给出的计算结果的例子进行了尝试。瞧! !它工作。所以我移动到下一步去计算所有多边形的位置,因为有太多的往返来计算每个多边形的数量。但是从循环中调用相同的函数不会返回任何东西。我已经在documentdb studio中测试了数组的每个查询,它确实返回结果。请帮助! !新过程的代码为:

function countABC(filterQueryArray) {
var results = [];
for (i = 0; i < filterQueryArray.length; i++) {
    countnew(filterQueryArray[i].QueryString, "");
}
getContext().getResponse().setBody(results);
function countnew(filterQuery, continuationToken) {
    var collection = getContext().getCollection();
    var maxResult = 50000;
    var result = 0;
    tryQuery(continuationToken);
    function tryQuery(nextContinuationToken) {
        var responseOptions = {
            continuation: nextContinuationToken,
            pageSize: maxResult
        };
        if (result >= maxResult || !query(responseOptions)) {
            setBody(nextContinuationToken);
        }
    }
    function query(responseOptions) {
        return (filterQuery && filterQuery.length) ?
            collection.queryDocuments(collection.getSelfLink(), filterQuery, responseOptions, onReadDocuments) :
            collection.readDocuments(collection.getSelfLink(), responseOptions, onReadDocuments);
    }
    function onReadDocuments(err, docFeed, responseOptions) {
        if (err) {
            throw 'Error while reading document: ' + err;
        }
        result += docFeed.length;
        if (responseOptions.continuation) {
            tryQuery(responseOptions.continuation);
        } else {
            setBody(null);
        }
    }

    function setBody(continuationToken) {
        var body = {
            count: result,
            continuationToken: continuationToken
        };            
        results.push(body);
    }
}

}

在documentdb中使用存储过程执行ST_WITHIN

对于new sproc,在循环之后设置result是没有帮助的,因为那时没有查询被执行(结果数组将是空的)。其思想是将所有CRUD/查询调用排队,并在将它们排队的脚本完成后执行(在本例中是主脚本)。

设置result/body需要从回调中完成。这已经部分完成了,但存在一个问题,即每次调用countnew时,"result"变量都会重置为0。基本上,"var result = 0"需要在主脚本中完成。

另外,不建议使用像"for"循环这样的循环,当它在循环中调用CRUD/查询而不等待先前的CRUD/查询完成时(由于异步性质),否则检查isAccepted是不可靠的。建议序列化这个循环,像这样:

var result = 0;
step();
function step() {
  if (filterQueryArray.length == 0) setBody(null);
  else {
    var query = filterQueryArray.shift();
  
    // process current query. In the end (from callback), call step() again.
  }
}

这有意义吗?