存储过程Azure Cosmos DB返回空集合

时间:2019-04-22 04:32:48

标签: javascript stored-procedures azure-cosmosdb

我尝试使用Azure文档中的示例sp创建代码创建存储过程,但无法获取集合详细信息。它总是返回null。

存储过程

// SAMPLE STORED PROCEDURE
function sample(prefix) {
    var collection = getContext().getCollection();
    console.log(JSON.stringify(collection));

    // Query documents and take 1st item.
    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        'SELECT * FROM root r',
    function (err, feed, options) {
        if (err) throw err;

        // Check the feed and if empty, set the body to 'no docs found', 
        // else take 1st element from feed
        if (!feed || !feed.length) {
            var response = getContext().getResponse();
            response.setBody('no docs found');
        }
        else {
            var response = getContext().getResponse();
            var body = { prefix: prefix, feed: feed[0] };
            response.setBody(JSON.stringify(body));
        }
    });

    if (!isAccepted) throw new Error('The query was not accepted by the server.');
}

控制台仅显示此内容。 Console output

结果显示由于未收集而未找到任何文档。我在执行时通过资源管理器传递了分区键。

3 个答案:

答案 0 :(得分:0)

您是否使用ToDoList集合创建了Items数据库?可以从Azure门户的“快速入门”刀片中执行此操作。

Deploy Collection from Quick start blade

然后创建一个SP来对该集合运行。不需要分区键,因此不需要其他参数(保留空白)。

Make sure you have a Collection created.

创建的集合没有任何文档。您可以选择通过Query Explorer刀片或通过快速入门刀片可用的示例ToDoList App添加文档。

答案 1 :(得分:0)

我有一个类似的问题。我认为当分区键为不是字符串时,Azure门户无法正确执行存储过程。

在我的情况下,我有一个为数字的partitionKey。当我通过门户网站执行存储过程时,即使我的数据库中有文档,我也总是得到一个空的resultSet。当我稍稍更改结构并将我的partitionKey设置为字符串时,存储过程可以正常工作。

答案 2 :(得分:0)

您的调试方式错误。

在控制台日志中看到 "{\"spatial\":{}}" 完全没问题,即使集合中有项目。为什么?好吧,因为那是那个对象的一个​​属性。

关于你所说的:

<块引用>

结果显示没有找到文档,因为没有得到集合

是假的。我有相同的控制台日志文本,但我的收藏中有项目。

对于您的存储过程为何不返回任何项目,我有两种情况:

  1. 我在尝试 azure 门户 UI(在浏览器中)时遇到了同样的问题,令我惊讶的是我必须插入一个没有 KEY 的项目,以便我的存储过程能够看到它。
  2. 在代码中,您将分区指定为字符串,即。 new PartitionKey("/UserId") 而不是你的对象,即。 new PartitionKey(stock.UserId)