我想在多边形内计算我的位置。这是我的存储过程:
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.');}
当我在查询资源管理器中执行相同的查询时,我得到了结果,但是通过存储过程,它返回“找不到文档”。它返回的结果是更简单的查询,但同样,返回的最大计数总是100.不确定我做错了什么。
提前致谢。
P.S。:我尝试将ST_DISTANCE用于这些坐标。它确实返回计数为100(最大值),但完全不适用于ST_WITHIN。
编辑: 它没有用。所以我按照官方例子中的描述尝试this来计算结果。瞧!!有效。所以我移动到下一步计算我在本地所有多边形中的所有位置,有太多的往返计数来获得每个多边形的计数。但是从循环调用相同的函数不会返回任何东西。我已经在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);
}
}
}
答案 0 :(得分:0)
使用新的sproc,在循环之后设置结果没有帮助,因为那时没有执行任何查询(结果数组将为空)。我们的想法是所有CRUD /查询调用都排队,并在排队的脚本完成后执行(在本例中为主脚本)。
设置结果/正文需要从回调中完成。这部分已经完成,但是有一个问题是,对于countnew的每次调用,“result”变量都会重置为0.实际上,“var result = 0”需要在主脚本中完成。
此外,当它在循环中调用CRUD /查询而不等待先前的CRUD /查询完成时(由于异步性质),不建议使用类似“for”循环的循环,否则检查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.
}
}
这有意义吗?