【问题标题】:Executing ST_WITHIN using stored procedure in documentdb使用 documentdb 中的存储过程执行 ST_WITHIN
【发布时间】:2016-10-24 12:41:01
【问题描述】:

我正在尝试计算我在多边形内的位置。这是我的存储过程:

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);
    }
}

}

【问题讨论】:

  • 你能显示poly吗?
  • { '坐标':[[[ - 72.56244522109489,42.195626800619728],[ - 72.5503062656826,42.195626160743714],[ - 72.550316627691416,42.186632945589423],[ - 72.562453856102479,42.186633585263621],[ - 72.56244522109489,42.195626800619728]] ],'type':'多边形'}
  • 你试过没有参数抽象吗?我想知道@poly 替换是否是一个逃避问题?
  • 是的。我也尝试了完整的查询。对于 ST_Distance,使用相同的参数。
  • 已添加到问题中。我无法理解为什么在推送到结果数组的正文中没有设置计数

标签: c# azure-cosmosdb


【解决方案1】:

使用新的存储过程,在循环之后设置结果是没有帮助的,因为那时没有执行任何查询(结果数组将为空)。这个想法是所有 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.
  }
}

这有意义吗?

【讨论】:

    猜你喜欢
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    相关资源
    最近更新 更多